2017-09-30 49 views
3

我有使用swing的這個簡單的java應用程序。然而,當我執行程序的時候,框架會出現,但我不能在任何地方點擊,而按鈕只會在幾秒鐘後出現。我對javas Swing庫非常陌生,所以我可能會錯過一些東西,但是從我讀過的代碼中不應該引起任何問題。Java JFrame凍結

import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 
import java.awt.FlowLayout; 
import javax.swing.*; 

public class Game { 

    public static void main(String[] args) { 

     JFrame frame = new JFrame("JFrame Example"); 
     JPanel panel = new JPanel(); 
     panel.setLayout(new FlowLayout()); 
     JLabel label = new JLabel("This is a label!"); 
     JButton button = new JButton(); 

     button.setText("Press me"); 

     panel.add(label); 
     panel.add(button); 

     frame.add(panel); 
     frame.setSize(300, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

    } 
} 

編輯 所以我重新安裝了JDK,但發現這樣的:如果我的瀏覽器運行時,我執行上面的代碼將掛起和凍結,​​但是如果我關閉瀏覽器,它運行正常。但是我不能啓動我的瀏覽器,直到我殺了我的應用程序,所以看起來我的安裝有問題,因爲它們不應該使用相同的資源?

編輯 解決我的問題:有JDK的多個版本和JRE安裝這樣既解除停止,然後安裝最新版本,一切似乎是工作!

+0

Java版本,操作系統,CPU,RAM? – PeterMmm

+0

我在Windows 10,i5-6600k和16GB內存上使用java 8。但是我剛剛意識到,即使在打開「關於Java」應用程序時也是如此,所以看起來我的問題與java相關,而不是這個特定的代碼。 – tiggybits

+0

應該像你一樣工作。我很好奇你的框架實際上是凍結還是僅僅在窗口大小調整後出現。 – Antoniossss

回答

-1

需要創建UI用戶界面下分派線程:

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     // code to create UI or call to function that creates the UI 
    } 
}); 

的Java 8風格:

SwingUtilities.invokeLater(()->{ 
    // Your UI code 
}); 

如果不使用成語則UI不能部分在不一致的狀態下創建,請參閱Creating UI in swing

幾乎所有的c創建或與Swing組件交互必須 事件調度線程

上運行,你也可以使用invokeAndWait ODE是你需要阻塞,直到UI創建。

+0

downvoting需要一些解釋。 –

+0

除了回答一個漂亮的副本,這不能回答這個問題。他的代碼適合我。你在概括,甚至沒有意識到實際的問題。 –

+0

我不會downvote,即使這是推薦的方式,這個例子在這裏運行沒有任何問題 – PeterMmm