向 JFrame 添加多个圆圈?(爪哇)



我正在尝试用不同的位置为JFrame绘制圆圈,在这种情况下是网格状的图案。

我似乎没有问题绘制具有x,y位置的单个圆,但是,当我尝试绘制具有不同位置的多个圆时,其他圆的位置会被遮挡。

在下面的代码中,我有两个数组:XPlacements 和 YPlacements,它们包含不同的 X 和 Y 位置以形成网格。对于每个 X 位置,应该在该 X 位置创建具有不同 Y 位置的圆(反之亦然(。

当我只让下面的代码画一个圆时,其中 XPlacements = {10} YPlacements = {100},它会画一个圆圈,看起来有点(10,100(从左上角开始。同样,当我添加多个 X 位置但单个 Y 位置时,似乎没有任何内容被遮挡。但是,当我添加多个 Y 位置时,每个下降的圆圈行似乎都越来越多地被推到右边。 当我运行它时,它会像这样模糊:http://imgur.com/HHjhvPD

我似乎无法通过更改 JFrame 的值来减少它的模糊。我能找到的所有 JFrame 圆圈教程都只处理 1 个圆圈,当我使用 1 个圆圈(或只有 1 行圆圈(时,我没有任何问题

有谁知道为什么下面的代码没有产生类似网格的模式?

谢谢。

public class Circle extends Canvas {
int XPos;
int YPos;
public void SetPosition(int x, int y) {
this.XPos = x;
this.YPos = y;
repaint();
}
public void paint(Graphics g) {
System.out.println("Filling oval with position ("+XPos+","+YPos+")");
g.fillOval(XPos, YPos, 15, 15);
}
}
public class MainFile extends JFrame {
static int[] XPlacements = {10,20,30};
static int[] YPlacements = {100,200,300};
static Circle[] Circles = new Circle[1000];
static int Circle_Count = 0;
public static void main(String[] args) {
JFrame frame = new JFrame("Grid of circles");
frame.setLayout(new GridLayout(1,1)); 
frame.setSize(800, 800);
for(int x=0;x<XPlacements.length;x++) {
for(int y=0;y<YPlacements.length;y++) {
System.out.println("Creating new circle "+Circle_Count+" with position "+XPlacements[x]+","+YPlacements[y]);
Circles[Circle_Count] = new Circle();
Circles[Circle_Count].SetPosition(XPlacements[x],YPlacements[y]);
frame.add(Circles[Circle_Count]);
Circle_Count++;
}
}
frame.setVisible(true);
}
}

首先,这是一个 Swing 应用程序,因此自定义绘画应该通过覆盖 JPanel 的 paintComponent(( 来完成。画布是不应在 Swing 应用程序中使用的 AWT 组件。

如果要在组件上绘制,则自定义绘制始终相对于偏移量 (0, 0( 完成。因此,在您的情况下,代码将是:

//g.fillOval(XPos, YPos, 15, 15);
g.fillOval(0, 0, 15, 15);

然后你需要覆盖类的 getPreferredSize(( 方法来设置组件的大小:

@Override
public Dimension getPreferredSize()
{
return new Dimension(15, 15);
}

阅读 Swing 教程中有关自定义绘画的部分,了解更多信息和工作示例。

现在,布局管理器具有有关组件的信息,并且可以在面板上定位每个组件:

因此,将圆圈添加到框架的代码如下所示:

frame.setLayout( new GridLayout(3, 3, 50, 50) );
for (int i = 0; i < 9; i++)
{
frame.add( new Circle() );
}

这将创建一个 3x3 网格,每个组件之间的间隙为 50 像素。

最新更新