3

我刚刚进入 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 时,矩形确实移动到了新位置,但它在旧位置仍然可见。只有当我调整窗口大小时,它才会刷新并且旧的矩形消失。我该如何解决这个问题,以便当我按下按钮时,矩形仅在新位置可见?

4

3 回答 3

3

它是

super.paintComponent(g);

不是

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

两者差别很大!第一个告诉您的 JPanel 执行通常由 paintComponent 方法执行的所有内务处理功能,包括重新绘制背景(项目的关键)。第二个,您调用的那个不执行上述任何功能。所以我的建议是去掉你的超级电话中的尾随 s 。

于 2011-03-13T12:11:26.250 回答
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()

于 2011-03-13T12:09:48.843 回答
1

您可以使用repaint()方法来做到这一点。

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

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

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

于 2011-03-13T12:12:55.893 回答