您好我正在尝试让我的程序移动我在屏幕上创建的形状,由于某种原因它不起作用我不知道发生了什么?它必须是一个小的东西,任何人都可以指出我正确的方向。
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);
}
});
}
}
答案 0 :(得分:2)
两个问题:
一种可能的解决方案是不使用Ellipse2D,而是使用paintComponent中的Graphics#drawOval(...)
绘制椭圆,并在该方法调用中使用更改的x字段。如果你必须使用Ellipse2D,那么你需要以某种方式翻译它们,也许是通过使用AffineTransform,但这种方式有点复杂,因为我认为你必须将你的Ellipse2D包装成一个Path2D可以使用。
另一个选项:创建一个BufferedImage精灵,使用从BufferedImage获得的Graphics2D对象将复杂形状绘制到BufferedImage中,然后通过drawImage(myImage, imageX, imageY, null)
在paintComponent中绘制,并更改Timer中的imageX。