JPanel不会正确地画画

时间:2012-10-15 20:16:44

标签: java swing jpanel geometry paintcomponent

我是Java和Swing的新手,这也是我的第一篇文章,如果它没有多大意义,那就很抱歉。

我要做的是当我点击JPanel时,我希望它在我点击的位置添加一个圆圈。目前,所有似乎都发生的事情就是当我点击时,我要添加的JPanel中会出现一个小的灰色方块,但我似乎找不到任何方法让它画成一个圆圈。

我有一个扩展JPanel的类叫做“Ball”,这是我点击时添加的内容。 目前,我并不担心它在正确的位置,只是为了正确地抽球。 以下是我的“Ball”课程的代码:

package paintsliders;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

class Ball extends JPanel{

private int x,y,w,h;

//I will use this constructor to put the ball in the correct location later.
Ball(){
    /*this.w = 100;
    this.h = 100;
    this.x = 200;
    this.y = 200;*/
}

//draw the ball
    @Override
public void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.drawOval(200,200,10,10);
      g.setColor(Color.RED);
    }

}

我可以猜测它与paintComponent方法有关,但我看到的任何地方似乎都找不到解决方案。

任何帮助都会很棒,谢谢!

2 个答案:

答案 0 :(得分:5)

Graphcis上下文已经被翻译为满足组件应该在其父容器中出现的x / y位置,这意味着Graphics上下文的左上角{ {1}}方法实际上是0x0。

你需要为球定义一些大小,你在10x10上绘画,这表明你的球组件应该返回{10}的paintComponent

preferredSize

当球被添加到父容器中时,您将负责为球提供适当的布局细节...

public Dimension getPreferredSize() {
    return new Dimension(10, 10);
}

当然,这假设您为父容器设置了public void mouseClicked(MouseEvent evt) { Point p = evt.getPoint(); Ball ball = new Ball(); Dimension size = ball.getPreferredSize(); ball.setBounds(new Rectangle(p, size)); add(ball); } 布局

<强>已更新

像...一样的东西。

See spot run

null

答案 1 :(得分:4)

您可能需要点击主JPanel

我宁愿设计主面板来处理鼠标单击而Ball类是一个简单的Object,它定义了一个知道如何绘制{{1}的drawBall(Graphics g, int x, int y)方法}}。这将由主面板中的Ball方法调用。在主面板中,您可以单击鼠标,创建paintComponent()类型的对象并调用Ball。在repaint()内,您拨打paintComponent()