Jmenubar IS /未显示在Sucsessive跑步中



大家好,我已经多次被动地使用了此页,因为有很多很好的解释,但是今天我必须自己问一个问题,因为我认为这是很奇怪,发生了什么。

我使用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()方法来确定其尺寸。然后,您添加到框架的组件的首选大小将用于确定帧大小。

相关内容

  • 没有找到相关文章