每次按下鼠标按钮,我都有一个面板,我必须在上面画球。应该在鼠标按下的位置绘制球。
球被拉得很好,但是每次都在同一个位置绘制,所以除非我移动"左右窗口,不会看到绘制的球。
这是我的代码:
GUIBalls
public class GUIBalls {
public JFrame frame = new JFrame("Balls");
public JPanel panel = new JPanel();
private ArrayList<Ball> b = new ArrayList<>();
private Random rnd = new Random();
public GUIBalls(){
setFrame();
//moveBalls();
}
public void setFrame(){
this.frame.setBounds(0,0,400,400);
this.frame.add(panel);
panel.setBounds(0,0,400,400);
this.panel.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
createBalls(x,y);
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
}
public void createBalls(int x, int y){
Ball ball = new Ball(x,y,10,10);
this.b.add(ball);
ball.draw(panel);
panel.repaint();
}
}
Ball
public class Ball extends JPanel {
int x;
int y;
int z;
int w;
public Ball(int x, int y, int z, int w) {
this.x = x;
this.y = y;
this.z = z;
this.w = w;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillOval(0, 0, z, w);
}
public void draw(JPanel panel) {
panel.add(this);
panel.setVisible(true);
}
}
由于某些奇怪的原因,球没有被绘制在不同的位置。
任何想法?
答案 0 :(得分:1)
您的代码现在的问题在于您尝试执行custom painting
并尝试创建custom component
。您需要决定要使用哪种方法。
有关自定义绘画的基础知识,请阅读Custom Painting上的Swing教程中的部分,该部分有一个显示如何执行此操作的工作示例。好吧,它展示了如何在面板上绘制正方形,但你明白了。
如果要继续添加要绘制的对象,则需要将对象保存在ArrayList中,然后在paintComponent()方法中迭代List以绘制每个对象。这种方法在Custom Painting Approaches中得到了证明。
如果要创建Ball作为组件,则需要确保覆盖获取首选大小以返回Ball的大小。然后,您始终在面板的偏移(0,0)处绘制椭圆。然后,将Ball组件添加到使用空布局的父面板。因为您使用null布局,所以您将使用setLocation(...)
方法将Ball定位在父面板上。您还需要使用Ball组件的setSize()
方法作为首选大小。