我有一个面板,我想要绘制东西。 在创建它时绘画就没问题了。
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事件起作用。 有什么想法吗?
答案 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的资源