我试图用不同的位置绘制圆圈到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);
}
}
答案 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像素。