打印多个对象

时间:2015-02-25 21:49:48

标签: java swing paint

您好我正在尝试让我的程序移动我在屏幕上创建的形状,由于某种原因它不起作用我不知道发生了什么?它必须是一个小的东西,任何人都可以指出我正确的方向。

 public class MultipleObs extends JFrame {
  private JPanel paintPanel;
  public MultipleObs() {
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setMinimumSize(new Dimension(300, 300));
    paintPanel = new PaintPanel();
    getContentPane().add(paintPanel, BorderLayout.CENTER);
    pack();
}

class PaintPanel extends JPanel implements ActionListener {
    private java.util.List<Shape> shapes;
    private Shape mouseOverShape=null;
    int x=0, velX=2;
    javax.swing.Timer tm = new javax.swing.Timer(5,this);
    public PaintPanel(){
        super();
        shapes = new ArrayList<Shape>();
        shapes.add(new Rectangle2D.Float(x,25,25,25));
        shapes.add(new Ellipse2D.Float(x, 15, 60, 30));
        shapes.add(new Ellipse2D.Float(x, 35, 60, 30));
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        for (Shape s : shapes){
            g2.draw(s);
        }
        tm.start();
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        x = x+ velX;
        repaint();
    }
}
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new MultipleObs().setVisible(true);
        }
    });
}

}

1 个答案:

答案 0 :(得分:2)

两个问题:

  1. 不要在paintComponent中启动Swing Timer。该方法应仅用于绘画和绘画。而是在构造函数中启动Timer。
  2. 创建Ellipse2D对象时,其位置是固定的。更改用于创建它的其中一个变量将不会影响已创建的对象。
  3. 一种可能的解决方案是不使用Ellipse2D,而是使用paintComponent中的Graphics#drawOval(...)绘制椭圆,并在该方法调用中使用更改的x字段。如果你必须使用Ellipse2D,那么你需要以某种方式翻译它们,也许是通过使用AffineTransform,但这种方式有点复杂,因为我认为你必须将你的Ellipse2D包装成一个Path2D可以使用。

    另一个选项:创建一个BufferedImage精灵,使用从BufferedImage获得的Graphics2D对象将复杂形状绘制到BufferedImage中,然后通过drawImage(myImage, imageX, imageY, null)在paintComponent中绘制,并更改Timer中的imageX。