2014-01-13 35 views
1

問題編碼的業務模擬,以及如下結構有代碼:多JFrames

在我的項目類的主要功能,我只運行的代碼短位:

javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
    InputGUI inputgui = new InputGUI(); 
    inputgui.setVisible(true); 
     } 
    }); 

其中InputGUI()是一個調用JFrame的類,我使用文本字段將參數傳遞給模擬。我點擊了一個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(); 

其使用時,所有我的代碼只是在主函數,我沒有寫和使用的GUI類尚未工作。

但是,現在JFrame打開時,我打了JButton,但框架不會更新,直到模擬結束。當它結束時,仿真的最後一個狀態就會按照它的樣子繪製,但在此之前,我只能看到模擬正常發生的灰色區域和窗口周圍的黑色邊框。

我在做什麼錯?

+2

聽起來像你正在EDT上進行模擬,這可能不是你想要的。看看Swing中的併發性。 –

回答

2

您可能會遇到Swing線程問題。當您以前從主線程運行代碼時,長時間運行的代碼會在主線程上運行,而不是在Swing線程中運行。現在,你的模擬在Swing線程正在啓​​動,這些問題都出現了,因爲你的長期運行的代碼現在在Swing運行Ë發泄d ispatch 牛逼 hread或EDT,佔用,有效地凍結該線程並阻止所有GUI繪圖的發生,因爲這是負責所有Swing繪畫和用戶交互的線程。

建議:

  • 用於所有長期運行的代碼的SwingWorker或其他後臺線程。
  • 請確保只更新擺動線程上的Swing對象,即EDT。 SwingWorker使這更容易做到。
  • 在你的繪畫方法中沒有任何你的代碼邏輯。 paintComponent方法應該僅用於繪圖和繪圖。

有關Swing線程問題的詳細信息(以及Keven Workman建議的),請查看Concurrency in Swing Tutorial。此外,如果這些建議不能幫助您,請考慮更多地講述並展示(編碼)我們。

+0

謝謝;我曾希望這件事更容易解決,但我確實懷疑過這樣的事情。我會給我的代碼重寫。 – Martin