gpt4 book ai didi

java - JMenuBar 在连续运行中是否显示

转载 作者:行者123 更新时间:2023-11-30 08:52:56 37 4
gpt4 key购买 nike

大家好,我已经被动地使用过这个页面很多次了,因为有很多很好的解释,但今天到目前为止,我不得不自己问一个问题,因为在我看来,发生的事情很奇怪。

我使用 Javax.Swing 中的 JFrame 编写了一个小游戏,其中包含一个 JMenu。该程序实际上运行良好,并且 JMenuBar 也在运行并显示。但是,当我运行该程序时,可能会发生菜单未显示的情况,尽管它确实存在(我可以使用快捷方式)。当显示菜单时,在我看来或多或少是随意的。我没有更改任何代码,并且在 eclipse 中没有警告或错误,但是有一次我看不到菜单栏。

到目前为止,我看不出这种情况何时发生的任何模式。我只能怀疑它与我关闭框架/程序的方式有关以及由于我的操作系统在后台发生的事情。

Windows 7 旗舰版 SP1Eclipse Java开发工具版本:3.10.1.v20150204-1700Java 版本 1.8.0_45

这是我生成 JFrame 的类的代码:然后在 actionhandler 中有一些东西来启动游戏等,还有一个主类来调用 Frame 类的构造函数。

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 包含标题栏和边框,那么 Screen 和 JFrame 的大小怎么可能相同呢?你真的应该只使用框架的 pack() 方法来确定它的大小。然后,您添加到框架中的组件的首选大小将用于确定框架大小。

关于java - JMenuBar 在连续运行中是否显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30006712/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com