Swing 画布重绘应自行调用

Swing 画布重绘应自行调用,swing,canvas,jpanel,jtabbedpane,Swing,Canvas,Jpanel,Jtabbedpane,我有一个jTabbedPane的应用程序。jTabbedPane中有两个选项卡(JPanel)。第一个选项卡包括画布,第二个选项卡包括简单的JLabel。按钮将矩形绘制到画布中 在那之前一切都很好。但是,在切换选项卡时,画布将丢失所有内容。它应该自己重新油漆 更改选项卡后应存在矩形。你知道这个问题吗 我的按钮代码如下: private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { Graphics g = c

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

在那之前一切都很好。但是,在切换选项卡时,画布将丢失所有内容。它应该自己重新油漆

更改选项卡后应存在矩形。你知道这个问题吗

我的按钮代码如下:

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

提前感谢。

首先,您不应该将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()
并使用作为参数传递的图形绘制组件。

不要在jcomponent.getGraphics返回的图形上绘制,它非常不稳定。相反,将矩形坐标存储在某个位置,重写paintComponent来绘制它,并在操作中调用repaint