【问题标题】:Canvas repaint should be called by itself画布重绘应该自己调用
【发布时间】:2013-02-24 16:28:51
【问题描述】:

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

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

更改选项卡后应该存在矩形。你对这个问题有什么想法吗?

我的按钮代码在这里:

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

提前致谢。

【问题讨论】:

  • 不要在 jcomponent.getGraphics 返回的图形上绘画,它非常不稳定。相反,将矩形坐标存储在某处,覆盖paintComponent 以绘制它并在动作中调用repaint

标签: swing canvas jpanel jtabbedpane


【解决方案1】:

首先,您不应该将 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 绘制组件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 2013-04-26
    • 1970-01-01
    • 2017-08-30
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多