用Java重绘图形

时间:2011-03-13 11:55:04

标签: java swing jpanel graphics2d

我刚刚使用Java进入图形,我遇到了问题。我创建了一个带有JPanel面板的JFrame窗口(NetBeans Designer),并在其上绘制了一些图形。然后我添加了一个改变变量的JButton,它将改变JPanel上正方形的X位置。

按下按钮,此代码将执行:

drawObject.setX(150);
drawObject.repaint();

drawObject是此类的一个实例:

public class sola extends JPanel {

    private int x = 10;

    @Override
    public void paintComponent(Graphics g){
        super.paintComponents(g);
        super.setBackground(Color.WHITE);

        g.setColor(Color.ORANGE);
        g.fill3DRect(x, 160, 100, 50, true);
    }

    public void setX(int xX){
        x = xX;
    }
}

现在,当我按下JButton时,矩形会移动到新位置,但是在旧位置仍然可见。只有当我调整窗口大小时才会刷新并且旧矩形消失。我怎样才能解决这个问题,所以当我按下按钮时,矩形只能在新位置看到?

3 个答案:

答案 0 :(得分:3)

这是

super.paintComponent(g);

super.paintComponents(g);  // note the s at the edn

两者之间的巨大差异!第一个告诉你的JPanel执行通常由paintComponent方法执行的所有内务处理功能,包括重新绘制背景(项目的键)。第二个,你的呼叫不执行任何上述功能。所以我的建议是摆脱超级电话中的尾随。

答案 1 :(得分:1)

您可以使用JComponent中的以下方法:(http://download.oracle.com/javase/6/docs/api/javax/swing/JComponent.html

void    repaint(long tm, int x, int y, int width, int height)
 Adds the specified region to the dirty region list if the component is showing.
void    repaint(Rectangle r)
 Adds the specified region to the dirty region list if the component is showing.

您可以在redraw()

之前拨打电话

答案 2 :(得分:1)

您可以使用repaint()方法来执行此操作。

如果在面板上使用paintComponent()。你应该恕我直言照顾整个面板中的绘画。您的示例中没有代码可以删除旧的绘制矩形。

我建议为矩形创建一个自己的Component。 (您可以从Component扩展)然后您可以像在面板中那样覆盖这些类的paintComponent方法。因为专家组应该充当容器组件。不是自己绘制矩形。

知道将这些组件的实例添加到普通的JPanel中。然后应按预期更新。