奇怪的java窗口行为

奇怪的java窗口行为,java,jframe,Java,Jframe,我正在尝试编写一个简单的桌面应用程序来管理帐户。我在开始阶段 我在我的旧电脑上运行它,有时会有奇怪的行为 Java版本 java版本“1.6.0_05” Java(TM)SE运行时环境(build 1.6.0_05-b13) Java热点(TM)客户端虚拟机(构建10.0-b19,混合模式,共享) 我的计算机配置 Microsoft Windows XP SP2 英特尔(R)赛扬(R)CPU 2.53GHz 1.96GHz 736MB内存 我有奇怪的行为。当我编译我的程序并加载jframe时,我

我正在尝试编写一个简单的桌面应用程序来管理帐户。我在开始阶段

我在我的旧电脑上运行它,有时会有奇怪的行为

Java版本

java版本“1.6.0_05” Java(TM)SE运行时环境(build 1.6.0_05-b13) Java热点(TM)客户端虚拟机(构建10.0-b19,混合模式,共享)

我的计算机配置

Microsoft Windows XP SP2 英特尔(R)赛扬(R)CPU 2.53GHz 1.96GHz 736MB内存

我有奇怪的行为。当我编译我的程序并加载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);
    }   
}
没有菜单的窗口

带菜单的窗口

任何关于改进代码的建议都将受到高度赞赏


谢谢

在窗口完全构建之前,不要调用
setVisible(true)
,也就是说,在对窗口执行最后一项操作时执行该语句


一旦窗口可见,您对窗口所做的任何更改都必须在GUI线程上完成。

在窗口完全构建之前,不要调用
setVisible(true)
,也就是说,将该语句作为您对窗口所做的最后一件事


一旦窗口可见,您对窗口所做的任何更改都必须在GUI线程上完成。

请注意,由于交付了什么“事件”,您会出现这种不稳定的行为(而不是一致的失败或一致的成功)。例如,如果您将鼠标移到菜单栏所在的位置,或更改窗口大小,您将看到位被“正确”绘制,因为底层图形堆栈检测到这些事件,并将受影响的区域标记为要更新

您还可以使用
repaint()
和/或
revalidate()
标记GUI组件进行更新

请注意,上面没有解释为什么您的代码不工作,原因如第一个答案所解释的,即您在实现窗口之前使其可见

其他一些技巧:通过使用以下方法确保所有GUI创建都发生在AWT EventQueue上,这是一个很好的实践

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


此外,在显示框架之前,最好在框架上调用
pack()
,因为这将使窗口正确调整其组件的大小并对其进行验证(如果没有这种验证,例如滚动窗格将无法正确更新滚动条)。

请注意,您会遇到这种不稳定的行为(而不是一致的失败或一致的成功)因为传递了什么“事件”。例如,如果您将鼠标悬停在菜单栏的位置上,或更改窗口大小,您将看到位被“正确”绘制,因为底层图形堆栈检测到这些事件,并将受影响的区域标记为要更新

您还可以使用
repaint()
和/或
revalidate()
标记GUI组件进行更新

请注意,上面没有解释为什么您的代码不工作,原因如第一个答案所解释的,即您在实现窗口之前使其可见

其他一些技巧:通过使用以下方法确保所有GUI创建都发生在AWT EventQueue上,这是一个很好的实践

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

此外,在显示框架之前,最好在框架上调用
pack()
,因为这将使窗口正确调整其组件的大小并对其进行验证(例如,如果没有这种验证,滚动窗格将无法正确更新滚动条)