2011-04-03 69 views
0

我正在嘗試編寫一個簡單的桌面應用程序來管理帳戶。我正處於開始階段。奇怪的java窗口行爲

我在我的舊電腦上運行它,我有時會得到奇怪的行爲。

Java版本

Java版本 「1.6.0_05」 的Java(TM)SE運行環境(1.6.0_05構建-B13) 的HotSpot的Java(TM)客戶端虛擬機(建設10.0 - B19,混合模式,共享)

我的電腦配置

的Microsoft Windows XP SP2 英特爾(R)賽揚(R)CPU 2.53GHz的1.96 GHz 736MB的RAM

我得到奇怪的行爲。當我編譯我的程序和jframe加載時,我有時會得到菜單,有時我沒有如圖所示的菜單。另外,當我嘗試調整我的jframe的大小時,jframe顯示菜單。

我的代碼

import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
import java.awt.AWTException; 

public class Main { 

    public static void main(String[] args) { 
     new Login(); 
    } 

} 

class Login extends JFrame{ 

    private int height=450; 
    private int width=300; 

    private Container container; 
    private GridBagLayout layout; 
    private GridBagConstraints constraints; 

    JTextArea textArea1, textArea2; 

    public Login() 
    { 
     initWindow(); 
     initMenu();    
    } 

    private void initWindow() 
    {   
     setVisible(true);  
     setSize(this.height, this.width);  
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Toolkit toolkit = Toolkit.getDefaultToolkit();   
     Dimension dim = toolkit.getScreenSize(); 
     setLocation((dim.width-this.width)/2, (dim.height-this.height)/2); 

     Image image = toolkit.createImage("account.gif"); 
     setIconImage(image); 
    } 

    private void initMenu() 
    { 
     JMenuBar menuBar = new JMenuBar(); 
     setJMenuBar(menuBar); 

     JMenu fileMenu = new JMenu("File");  
     JMenu helpMenu = new JMenu("Help"); 

     menuBar.add(fileMenu);  
     menuBar.add(helpMenu); 

     JMenuItem configureAction = new JMenuItem("Configure"); 
     JMenuItem exitAction = new JMenuItem("Exit"); 

     fileMenu.add(configureAction); 
     fileMenu.add(exitAction); 

     JMenuItem helpAction = new JMenuItem("Help"); 
     JMenuItem aboutAction = new JMenuItem("About"); 

     helpMenu.add(helpAction); 
     helpMenu.add(aboutAction); 
    } 
} 

窗口沒有菜單

No menu fig

窗口的菜單

enter image description here

提高代碼的任何建議與高度讚賞。

謝謝

回答

1

不要叫setVisible(true),直到窗口完全建立,即。做這個陳述作爲你對窗口做的最後一件事。

一旦窗口可見,您對窗口所做的任何更改都必須在GUI線程上完成。

2

請注意,由於傳遞「事件」,您會得到這種不穩定的行爲(而不是一致的失敗或一致的成功)。例如,如果將鼠標移到菜單欄的位置,或更改窗口大小,則會看到「正確」繪製位,因爲底層圖形堆棧檢測到這些事件並標記了受影響的區域以進​​行更新。

您還可以使用repaint()和/或revalidate()標記GUI組件進行更新。

請注意,上述內容並不能解釋爲什麼您的代碼無法正常工作,其原因正如第一個答案所解釋的那樣,您已在實現該窗口之前將該窗口顯示爲可見。

一些其他提示:這是很好的做法,以確保發生在AWT EventQueue的所有GUI創建,通過使用類似

java.awt.EventQueue.invokeLater(new Runnable() { 
    public void run() { 
    // call code which creates the GUI in here 
    } 
} 

還是SwingUtilities.invokeLater()版本。

此外,在使框架可見之前調用pack()是一個好主意,因爲這將使窗口正確地調整它的組件大小並驗證它們(並且沒有這種驗證,例如,滾動條不會更新滾動條正確)。

+0

謝謝,這是可觀的... !!!但我必須接受其他答案。 – 2011-04-03 06:39:08