在运行期间在面板上绘画

时间:2012-09-24 09:53:15

标签: java awt panel

我有一个面板,我想要绘制东西。 在创建它时绘画就没问题了。

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事件起作用。 有什么想法吗?

2 个答案:

答案 0 :(得分:2)

问题是只要窗口系统(或OS)决定需要在屏幕上重新绘制特定的图形组件,就可以随时调用paint()方法。这可能在任何时候发生(最常见的是调整大小,移动,切换窗口等)。要查看它发生的频率,只需在paint()方法的开头添加一条日志消息。如果你在画布上画一些东西很可能它被画了,但是另一个重绘请求来自OS /窗口系统,你的绿线被对象的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()。这样,组件只负责绘制自身(而不是任何子项或边框)。

答案 1 :(得分:0)

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