我正在尝试使用Graphics2D绘制JPanel,并且希望在done()
中进行一些数学运算后,在SwingWorker的doInBackGround()
方法中进行绘制,但这似乎未绘制任何内容?
我的代码有什么问题?
class MyJanel extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 600);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
MyExecutor worker = new MyExecutor(g2);
worker.execute();
}
class MyExecutor extends SwingWorker<Void,Void> {
Graphics2D gRef;
int result;
public MyExecutor(Graphics2D g2){
gRef = g2;
}
@Override
protected Void doInBackground() {
result = 100+100;
return null;
}
@Override
protected void done() {
gRef.drawLine(20, 20, result, result);
}
}
}
最佳答案
paintComponent()方法仅用于绘画!从paintComponent()方法中删除SwingWorker代码。
如果要绘制组件,则done()方法应在组件上调用属性。例如,在您尝试绘制一条线的情况下,paintComponent方法中的代码可能类似于:
super.paintComponent(g);
if (drawLine)
g.drawLine(...);
然后,您将创建一个类似以下的方法:
public void setDrawLine(Boolean drawLine)
{
this.drawLine = drawLine;
repaint();
}
因此,在done()方法中,您只需在组件上调用
setDrawLine(true)
。另外,每当您进行自定义绘制时,都需要重写
getPreferredSize()
方法以返回组件的尺寸,以便布局管理器可以使用此信息,否则大小将为(0,0),并且没有任何要绘制的内容。阅读Custom Painting上的Swing教程以获取更多信息和工作示例。也许您还需要一个单独的方法来在组件中启动SwingWorker。
编辑:
我更改了您的代码:
@Override
public void paintComponent(final Graphics g)
{
super.paintComponent(g);
g.drawLine(10, 0, 10, 100);
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
g2.drawLine(100, 0, 100, 100);
}
});
}
这也不起作用。我猜想由于代码已添加到EDT的末尾,因此在执行Graphics对象时就已经对其进行了处理。
关于java - 尝试从SwingWorker的done()方法中绘制JPanel不会执行任何操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29354177/