我一直在编写流量模拟代码,并按如下方式构建代码:
在我的项目类的主要功能中,我只运行了一小段代码:
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
InputGUI inputgui = new InputGUI();
inputgui.setVisible(true);
}
});
其中InputGUI()是一个调用JFrame的类,我使用textfields将参数传递给模拟。我点击了一个JButton,它在ActionPerformed事件处理程序中调用了函数runsimulation()。
在此运行模拟中,我运行实际模拟,但也打开一个新的JFrame,可视化地模拟模拟正在进行的操作。代码如下:
RoadNetwork roadnetwork = new RoadNetwork();
roadnetwork.setVisible(true);
JFrame frame = new JFrame();
frame.add(roadnetwork);
frame.setSize(1250, 750);
frame.setVisible(true);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
其中RoadNetwork是一个扩展JPanel的类,它通过覆盖paintComponent来处理vizualisation。然后,在runsimulation()函数的迭代for循环中,我调用
roadnetwork.repaint();
当我的所有代码都只在main函数中并且我还没有编写并使用GUI类时,它曾经工作过。
但是,现在当我点击JButton时JFrame会打开,但是在模拟结束之前帧不会更新。当它结束时,模拟的最后状态按原样绘制,但在此之前,我只看到模拟正常发生的灰色区域,窗口周围的黑色边框。
我做错了什么?
答案 0 :(得分:2)
您可能遇到了Swing线程问题。当您以前从主线程运行代码时,长时间运行的代码在主线程上而不是在Swing线程中运行。现在您的模拟正在Swing线程中启动,因为您的长期运行的代码现在在Swing E vent D ispatch T中运行,所以问题正在显示 hread或 EDT ,占用并有效冻结此线程并阻止所有GUI绘图发生,因为这是负责所有Swing绘画和用户交互的线程。
建议:
有关Swing线程问题的详细信息(以及Keven Workman建议),请查看Concurrency in Swing Tutorial。此外,如果这些建议对您没有帮助,请考虑更多地告诉和展示(代码)我们。