0

我有一个面板,我想在上面画东西。在它被创建的时候在上面绘画是没有问题的。

canvas = new Panel() {
    public void paint(Graphics g) {
        g.setColor(Color.WHITE);
        g.drawLine(0, 0, 10, 10);
    }
};

但后来我想在运行时利用它。本能地,我创造了这样的东西:

Graphics g = canvas.getGraphics();
g.setColor(Color.GREEN);
g.drawLine(10, 10, 20, 20);
canvas.paint(g);

可悲的是,这不起作用。这可能是一个简单的问题,但我无法通过搜索找到令人满意的结果。那么我该如何做我想做的事呢?


对不起上面的问题。我刚刚在按钮单击事件上添加了绘制代码,它可以工作。它只是不适用于父框架的 windowOpened 事件。任何想法为什么?

4

2 回答 2

2

问题是只要窗口系统(或操作系统)决定需要在屏幕上重新绘制特定的图形组件,就可以随时调用paint() 方法。这可能随时发生(通常在调整大小、移动、切换窗口等时)。要查看它发生的频率,只需在 paint() 方法的开头添加一条日志消息。如果您仅在画布上绘制某些东西,则很有可能已绘制,但是另一个重绘请求来自操作系统/窗口系统,并且您的绿线被对象的 paint() “透支”了。所以答案是任何自定义绘画都应该在paint()中完成。您可以为您的子类添加额外的属性(例如 boolean drawGreenLine),在paint() 中检查它并采取任何适当的操作,例如:

class MyPanel extends JPanel {

    boolean drawGreenLine;

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.WHITE);
        g.drawLine(0, 0, 10, 10);
        if (drawGreenLine) {
            g.setColor(Color.GREEN);
            g.drawLine(10, 10, 20, 20);

        }  
    }
};

编辑:正如@MadProgrammer 所建议的,该示例已更改为覆盖paintComponent()。这样,组件只负责绘制自己(而不是任何子项或边框)。

于 2012-09-24T10:03:49.890 回答
0

尝试g.dispose()释放 GraphicsContext 的资源

于 2012-09-24T10:11:04.253 回答