画布重绘应该自己调用

时间:2013-02-24 16:28:52

标签: swing canvas jpanel jtabbedpane

我有一个使用jTabbedPane的应用程序。 jTabbedPane中有两个选项卡(JPanel)。第一个选项卡包括画布,第二个选项卡包括简单的JLabel。按钮将矩形绘制到画布中。

在此之前,每件事情都很好。但是,当切换标签时,画布会丢失所有内容。它应该自己重新粉刷。

更改标签后应存在矩形。你对这个问题有什么看法吗?

我的按钮代码在这里:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    Graphics g = canvas1.getGraphics();
    g.drawRect(10, 10, 100, 100);
}

提前致谢。

1 个答案:

答案 0 :(得分:0)

首先,您不应将AWT组件放在Swing组件中。使用JComponent或JPanel而不是Canvas。

第二,不,它不应该重绘自己。单击该按钮时,您应该只存储应在某个变量中绘制的内容,并且应覆盖paintComponent()方法以绘制存储在此变量中的内容。这样,每次重新绘制组件时,它都会重新绘制此变量中最后存储的内容。

例如:

public class RectangleComponent extends JComponent {

    private boolean shouldPaintRectangle = false;

    public void setShouldPaintRectangle(boolean b) {
        this.shouldPaintRectangle = b;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (shouldPaintRectangle) {
            g.drawRect(10, 10, 100, 100);
        }
    }
}

一般情况下,你永远不应该询问组件的图形并在其上绘画。相反,您应该覆盖paintComponent()并使用作为参数传递的Graphics来绘制组件。