如何使用用户输入更改绘制对象的位置

时间:2014-02-03 22:03:34

标签: java swing jpanel paint draw

我正在尝试绘制多条鱼(非常简单的鱼),就像用户指定的那样多。但是当用户指定他们想要绘制多条鱼时,圆圈不会在适当的位置绘制。所有椭圆形都是绘制的,它们不在正确的位置,因此它们看起来不再像鱼一样。

public class FishList extends JPanel {

static int fn = Integer.parseInt(JOptionPane.showInputDialog(null, "How many fish would you like to draw? "));
static int w = 200;
static int h = 100;
static int x;
static int y; 
static int a = x + 20;
static int b = y + 30;
static int d = 50;
static int c = x + 195;

public FishList() {
  setPreferredSize(
        new Dimension(400,400));
}

public void paint(Graphics g) {
  g.setColor(Color.GREEN);
  g.fillOval(x, y, w, h);
  g.fillOval(c, y, d, h);
  g.setColor(Color.BLACK);
  g.fillOval(a, b, 25, 25);
}

public static void main(String[] args) {
  MyFrame frame1 = new MyFrame("Drawing Fish");
  JPanel outer = new JPanel();

  for(int i=0; i<fn; i++){
     x = 0 + (i*(w+d+1));
     y = 0;
     FishList sPanel1 = new FishList();
     outer.add(sPanel1);

  }

  frame1.add(outer);
  frame1.pack(); 
  frame1.setVisible(true);
}
}

1 个答案:

答案 0 :(得分:2)

默认情况下,

JPanel使用FlowLayoutFlowLayout还使用组件的首选大小来确定如何在Container中布局每个组件。

未能致电super.paint会导致严重问题。实际上,您应该使用paintComponent代替paint,并确保拨打super.paintComponent

请查看Performing Custom PaintingPainting in AWT and Swing了解详情

组件已经具有位置感和大小感,您忽略了这一点。在这种情况下使用static变量不会有帮助,因为基本上,你的鱼的每个实例都将绘制在完全相同的位置,因为它们将共享每个{{1}的相同值。 1}}变量......

更好的解决方案是生成一个能够开始绘制的类,然后绘制“鱼”。

这些将包含在能够绘制它们的组件中,然后您可以将其添加到使用static的{​​{1}}。

例如......

Go Fish

Container