将多个圈子添加到JFrame? (Java)的

时间:2017-07-13 15:54:01

标签: java swing 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);
}
}

1 个答案:

答案 0 :(得分:1)

首先,这是一个Swing应用程序,因此应该通过覆盖JPanel的paintComponent()来完成自定义绘制。 Canvas是一个不应在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);
}

阅读Custom Painting上Swing教程中的部分,了解更多信息和工作示例。

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

因此,将圈子添加到框架的代码将类似于:

frame.setLayout( new GridLayout(3, 3, 50, 50) );

for (int i = 0; i < 9; i++)
{
    frame.add( new Circle() );
}

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