Java 运行时在面板上绘制

Java 运行时在面板上绘制,java,awt,panel,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

我有一个画板,我想在上面画些东西。 当它被创造出来的时候,在上面画画是没有问题的

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);
遗憾的是,这不起作用。 这可能是一个简单的问题,但我无法通过搜索找到令人满意的结果。 那我怎么做我想做的呢


对不起,上面的问题。 我刚刚在一个按钮点击事件中添加了绘画代码,效果很好。 它只是在父帧的WindowOpen事件上不起作用。
有什么想法吗?

问题是,只要窗口系统(或操作系统)决定需要在屏幕上重新绘制特定图形组件,就可以随时调用paint()方法。这可能随时发生(通常在调整大小、移动、切换窗口等时发生)。要查看它发生的频率,只需在paint()方法的开头添加一条日志消息。如果只在画布上绘制某个对象一次,它很可能已被绘制,但另一个重新绘制请求来自OS/window系统,并且您的绿线被对象的绘制()透支。 因此,答案是任何自定义绘制都应该在paint()中完成。您可以向子类添加额外属性(例如布尔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()。这样,组件只负责绘制自身(而不是任何子级或边框)。

尝试
g.dispose()
释放GraphicsContext的Resources

仅当您已经创建了图形时,使用awt中的某些元素,例如g.create()。gc处理与swing中的处理略有不同。我经常遇到类似的问题,可以通过处理gct来解决这些问题。这对我来说毫无意义。AWT和Swing之间的唯一区别是AWT组件有自己的本地对等点,Swing组件共享一个对等点(通常来自顶级容器)&支持双缓冲。改变你的例子,使用paintComponet,并调用它的超级方法,我会很高兴向上投票。。。我的意思是:PJPanel,paintComponent是在Swing中使用的,而不是在Swing中使用的AWT@Hachi然后使用Panel和paint(),但概念保持不变,“我有一个我想在上面画东西的面板”改为绘制到
buffereImage