我正在尝试使用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/

10-10 11:49