我正在尝试编写一个简单的桌面应用程序来管理帐户。我处于起步阶段。
我在旧计算机上运行它,有时会出现奇怪的行为。
Java版
java版“1.6.0_05” Java(TM)SE运行时环境(版本1.6.0_05-b13) Java HotSpot(TM)客户端VM(版本10.0-b19,混合模式,共享)
我的电脑配置
Microsoft Windows XP SP2 Intel(R)Celeron(R)CPU 2.53GHz 1.96GHz 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);
}
}
没有菜单的窗口
带菜单的窗口
任何改进代码的建议都会受到高度赞赏。
谢谢
答案 0 :(得分: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()
之前将其显示为可见,因为这会使窗口大小正确并验证它们(并且没有这样的验证,例如滚动窗格不会正确更新滚动条。)
答案 1 :(得分:1)
在窗口完全构建之前不要调用setVisible(true)
,即。做这个陈述是你对窗口做的最后一件事。
一旦窗口可见,您对窗口所做的任何更改都必须在GUI线程上完成。