如何在java中同时使用Multiple Paint Components

时间:2017-04-29 19:46:26

标签: java swing paintcomponent

我正在用java创建一个GUI,它表示最长的路径问题我正在使用Graphics 2D来绘制顶点和它们之间的链接。我已经制作了一个按钮来计算两个顶点之间的最长路径我想要一个缓慢增长的链接,所以,我已经使用了Thread.sleep()方法来实现它,但是当我使用它时,整个程序变得非常慢,滞后。 我已经覆盖了要绘制的paintComponent方法,我不能使用多线程,因为这会导致EDT(事件调度线程)出现问题。 我已经看过多个油漆组件的其他主题,但没有任何帮助我。任何想法或帮助??

public void paintComponent(Graphics g)
{   
    super.paintComponent(g);
    if(!dragging&&MainFrame.ActiveAddNode)
    g.drawRect(X,Y, 20, 20);//Virtual rectangle for the vertex
    p=new Polygon();
    for(int i=0;i<Node.size();i++)
    {
        p.addPoint(Node.get(i).X+10, Node.get(i).Y+10);
        g.setColor(Node.get(i).c);
        g.fillRect(Node.get(i).X, Node.get(i).Y, 20, 20);//represents the graph vertex
        g.setColor(Color.CYAN);
        g.drawString(""+i, Node.get(i).X+7,  Node.get(i).Y+15);//the number of the vertex

    }
for(int i=0;i<Node.size();i++)
    for(int j=0;j<Node.get(i).Children.size();j++){
        g.setColor(Color.BLUE);
        for(int k=0;k<link.size()-1;k++)
        {
            if(link.get(k)==i&&link.get(k+1)==Node.get(i).Children.get(j)){
                g.setColor(Color.RED);//Highlight the Longest path link
            }
        }

        g.drawLine(Node.get(i).X+10, Node.get(i).Y+10, Node.get(Node.get(i).Children.get(j)).X+10
                ,  Node.get(Node.get(i).Children.get(j)).Y+10);
        int Xsum=(Node.get(i).X+Node.get(Node.get(i).Children.get(j)).X)/2;
        int Ysum=(Node.get(i).Y+Node.get(Node.get(i).Children.get(j)).Y)/2;
        g.drawString(""+Node.get(i).Edges.get(j),Xsum,Ysum);

    }//end of 2nd loop
}//end of paint component

1 个答案:

答案 0 :(得分:3)

  

我使用过Thread.sleep()

代码在Thread.sleep(...)上执行时,请勿使用Event Dispatch Thread (EDT)。这将阻止GUI绘制自己。

paintComponent(...)方法的要点是绘制组件的当前状态。

因此,您需要一种允许您动态更改组件状态的方法。所以也许你有一个属性:setPathLength(...)。因此,一旦计算出最长路径,就会知道显示整个路径需要多少次迭代。

然后您需要使用Timer来安排动画。每次Timer点火都需要增加&#34;路径长度&#34;按1然后重新绘制()你的组件。所以每次再绘制一个节点。

阅读How to Use Swing Timers上的Swing教程中的部分以获取更多信息。