大家好,我已经多次被动地使用了此页,因为有很多很好的解释,但是今天我必须自己问一个问题,因为我认为这是很奇怪,发生了什么。
我使用Javax.swing的Jframe(包括Jmenu)编程了Litte游戏。该程序的工作实际上还不错,Jmenubar也正在工作和显示。但是,当我运行该程序时,可能会遇到菜单实际上在那里(我可以使用快捷方式),但没有显示菜单。显示菜单时,在我看来,在我看来或多或少任意。我不会更改代码的一点点,并且不会在Eclipse中有任何警告或错误,但是一次,我可以看到菜单在另一个时间内看到。
到目前为止,我看不到任何何时出现的模式。我只能怀疑这与我关闭框架/程序的方式有关以及由于我的操作系统而发生的事情。
Windows 7 Ultimate SP1Eclipse Java开发工具版本:3.10.1.v20150204-1700Java版本1.8.0_45
这是我的类代码生成jframe:然后,ActionHandler中有一些可以启动游戏等的内容,而主类则可以拨打框架类的构造函数。
public class Frame extends JFrame implements ActionListener{
private Screen s;
public Frame()
{
//---set frame
this.setUndecorated(false);
this.setTitle("Super Tick Tack Toe");
ImageIcon frameIcon = new ImageIcon(Frame.class.getResource("res/STTT_icon_64x64.png"));
this.setIconImage(frameIcon.getImage());
this.setDefaultCloseOperation(Frame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setResizable(false);
this.setSize(windowWidth,windowHeight);
this.setLocationRelativeTo(null);
//---game Menu
//---exit
JMenuItem exit = new JMenuItem("exit");
KeyStroke escKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0);
exit.setAccelerator(escKeyStroke);
exit.addActionListener(this);
//---load
JMenuItem save = new JMenuItem("save game");
KeyStroke saveKeyStroke = KeyStroke.getKeyStroke("control S");
save.setAccelerator(saveKeyStroke);
save.addActionListener(this);
//---save
JMenuItem load = new JMenuItem("load game");
KeyStroke loadKeyStroke = KeyStroke.getKeyStroke("control L");
load.setAccelerator(loadKeyStroke);
load.addActionListener(this);
//---preferences
JMenuItem preferences = new JMenuItem("preferences");
preferences.addActionListener(this);
JMenuItem newGame = new JMenuItem("new game");
KeyStroke newGameKeyStroke = KeyStroke.getKeyStroke("F2");
newGame.setAccelerator(newGameKeyStroke);
newGame.addActionListener(this);
//---pack game
JMenu game = new JMenu("game");
game.add(newGame);
game.add(new JSeparator()); // SEPARATOR
game.add(save);
game.add(load);
game.add(new JSeparator()); // SEPARATOR
game.add(preferences);
game.add(new JSeparator()); // SEPARATOR
game.add(exit);
//---help Menu
//---about
JMenuItem about = new JMenuItem("about STTT");
about.addActionListener(this);
KeyStroke aboutKeyStroke = KeyStroke.getKeyStroke("F12");
about.setAccelerator(aboutKeyStroke);
//---rules
JMenuItem rules = new JMenuItem("rules");
rules.addActionListener(this);
KeyStroke rulesKeyStroke = KeyStroke.getKeyStroke("F1");
rules.setAccelerator(rulesKeyStroke);
//---pack help
JMenu help = new JMenu("help");
help.add(rules);
help.add(new JSeparator()); // SEPARATOR
help.add(about);
//---pack menu bar
JMenuBar mb = new JMenuBar();
mb.add(game);
mb.add(help);
this.setJMenuBar(mb);
s = new Screen();
s.setBounds(0, 0, windowWidth, windowHeight);
add(s);
}
public void repaint()
{
s.repaint();
}
private class Screen extends JLabel{
private static final long serialVersionUID = 1L;
@Override
public void paintComponent(Graphics gg)
{
super.paintComponent(gg);
if(SuperTickTackToe.playing){
Graphics2D g = (Graphics2D) gg;
STTTgame.draw(g);
}
}
}
this.setVisible(true);
this.setResizable(false);
this.setSize(windowWidth,windowHeight);
this.setLocationRelativeTo(null);
不要在构造函数开始时调用上述代码。
您应该调用setVisible(true)作为帧构造函数中的最后一个语句,毕竟所有组件已创建并添加到帧中。
s = new Screen();
s.setBounds(0, 0, windowWidth, windowHeight);
add(s);
this.setResizable(false);
this.setSize(windowWidth,windowHeight);
this.setLocationRelativeTo(null);
this.setVisible(true);
另外,由于jframe包含标题栏和边框,屏幕和Jframe的大小如何相同?您确实应该只使用框架的Pack()方法来确定其尺寸。然后,您添加到框架的组件的首选大小将用于确定帧大小。