如何在 java 中同时使用多个 Paint 组件
How to use Multiple Paint Components at the same time in java
我正在制作一个带有 java 的 GUI,它表示最长路径问题 我正在使用 Graphics 2D 绘制顶点和它们之间的 link。我制作了一个按钮来计算两个顶点之间的最长路径我想制作一个缓慢增长的 link 所以我使用 Thread.sleep() 方法来制作它但是当我使用它时整个程序变得非常缓慢和滞后。
我已经覆盖了 paintComponent 方法来绘制,但我不能使用多线程,因为这会导致 EDT(事件调度线程)出现问题。
我看过其他有关多绘画组件的主题,但没有任何帮助 me.Any 想法或帮助??
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
I've used Thread.sleep()
在 Event Dispatch Thread (EDT)
上执行代码时不要使用 Thread.sleep(...)
。这将防止 GUI 自行绘制。
paintComponent(...)
方法的要点是绘制组件的当前状态。
因此您需要一种方法来动态更改组件的状态。所以也许你有一个 属性 像:setPathLength(...)
。所以一旦你计算出最长的路径,你就知道需要多少次迭代才能显示整个路径。
然后您需要使用 Timer
来安排您的动画。每次 Timer
触发时,您需要将 "path length" 增加 1,然后重新绘制()您的组件。所以每次多画一个节点。
阅读 How to Use Swing Timers 上的 Swing 教程部分了解更多信息。
我正在制作一个带有 java 的 GUI,它表示最长路径问题 我正在使用 Graphics 2D 绘制顶点和它们之间的 link。我制作了一个按钮来计算两个顶点之间的最长路径我想制作一个缓慢增长的 link 所以我使用 Thread.sleep() 方法来制作它但是当我使用它时整个程序变得非常缓慢和滞后。 我已经覆盖了 paintComponent 方法来绘制,但我不能使用多线程,因为这会导致 EDT(事件调度线程)出现问题。 我看过其他有关多绘画组件的主题,但没有任何帮助 me.Any 想法或帮助??
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
I've used Thread.sleep()
在 Event Dispatch Thread (EDT)
上执行代码时不要使用 Thread.sleep(...)
。这将防止 GUI 自行绘制。
paintComponent(...)
方法的要点是绘制组件的当前状态。
因此您需要一种方法来动态更改组件的状态。所以也许你有一个 属性 像:setPathLength(...)
。所以一旦你计算出最长的路径,你就知道需要多少次迭代才能显示整个路径。
然后您需要使用 Timer
来安排您的动画。每次 Timer
触发时,您需要将 "path length" 增加 1,然后重新绘制()您的组件。所以每次多画一个节点。
阅读 How to Use Swing Timers 上的 Swing 教程部分了解更多信息。