多个JFrame的问题

时间:2014-01-13 13:40:18

标签: java swing

我一直在编写流量模拟代码,并按如下方式构建代码:

在我的项目类的主要功能中,我只运行了一小段代码:

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会打开,但是在模拟结束之前帧不会更新。当它结束时,模拟的最后状态按原样绘制,但在此之前,我只看到模拟正常发生的灰色区域,窗口周围的黑色边框。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您可能遇到了Swing线程问题。当您以前从主线程运行代码时,长时间运行的代码在主线程上而不是在Swing线程中运行。现在您的模拟正在Swing线程中启动,因为您的长期运行的代码现在在Swing E vent D ispatch T中运行,所以问题正在显示 hread或 EDT ,占用并有效冻结此线程并阻止所有GUI绘图发生,因为这是负责所有Swing绘画和用户交互的线程。

建议:

  • 对所有长时间运行的代码使用SwingWorker或其他后台线程。
  • 确保仅在Swing线程(EDT)上更新Swing对象。 SwingWorker使这更容易。
  • 您的绘画方法中没有任何代码逻辑。 paintComponent方法应仅用于绘图和绘图。

有关Swing线程问题的详细信息(以及Keven Workman建议),请查看Concurrency in Swing Tutorial。此外,如果这些建议对您没有帮助,请考虑更多地告诉和展示(代码)我们。