2

嗨,我刚刚使用菜单栏为 Swing 编写了代码。但是问题出现在运行中。我输入:

javac Menu.java
java Menu

它没有给出错误,但没有显示 GUI。这是我的源代码供参考:

import javax.swing.*;
class Menu extends JFrame
{
    JMenuBar mb;
    JMenu m1,m2,m3;
    JMenuItem mn1,mn2,mn3;
    JCheckBoxMenuItem chk1,chk2,chk3;
    JRadioButtonMenuItem rd1,rd2,rd3;
    JSeparator sp1,sp2,sp3;
    Menu()
    {
        setTitle("MenuBar Demo");
        mb = new JMenuBar();
                m1 = new JMenu("File");
                m2 = new JMenu("Edit");
                m3 = new JMenu("View");
                mn1 = new JMenuItem("New");
                mn2 = new JMenuItem("Open");
                mn3 = new JMenuItem("Close");
                chk1 = new JCheckBoxMenuItem("Cut");
                chk2 = new JCheckBoxMenuItem("Copy");
                chk3 = new JCheckBoxMenuItem("Paste");
                rd1 = new JRadioButtonMenuItem("Find");
                rd2 = new JRadioButtonMenuItem("Find Next");
                rd3 = new JRadioButtonMenuItem("Replace");
                sp1 = new JSeparator();   
                sp2 = new JSeparator();   
                sp3 = new JSeparator();   
                m1.add(mn1);
                m1.add(mn2);
                m1.add(sp1);
                m1.add(mn3);
                m2.add(chk1);
                m2.add(chk2);
                m2.add(sp2);
                m2.add(chk3);
                m3.add(rd1);
                m3.add(rd2);
                m3.add(sp3);
                m3.add(rd3);
                mb.add(m1);
                mb.add(m1);
                mb.add(m2);
                mb.add(m3);
                getContentPane().add(mb);
                mb.setSize(300, 300);
                mb.setVisible(true);
    }
        public static void main(String[] args)
        {
            new Menu();
        }

}

为什么没有出现 GUI?

4

3 回答 3

4

使用类似的东西:

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            Menu app = new Menu();
            app.setVisible(true);
        }
    });

}

我建议重命名您的课程,因为这是一个应用程序/框架而不是菜单。

于 2012-06-23T11:06:44.583 回答
4

在构造函数的最后,调用this.setVisible(true);

一般提示

  • 不要扩展框架,而是保留对框架的引用。
  • 不要调用setVisible(true)组件,而是将它们添加到一个可见的容器中。菜单栏似乎没有添加到任何东西。添加它使用setJMenuBar(JMenuBar)
  • 不要设置组件的大小。使用适当的布局、填充和边框,然后pack()使用 GUI。
  • 对代码块使用一致且合乎逻辑的缩进。它有助于可读性。
  • & 正如 Puce 提到的,在 EDT 上启动和更改 GUI。

这些更改将在屏幕上生成一个小的 GUI。

// ...
//getContentPane().add(mb);
setJMenuBar(mb);
//mb.setSize(300, 300);
//mb.setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
pack();
setVisible(true);
于 2012-06-23T11:05:26.443 回答
3

默认情况下,JFrame 可见性是false

你忘了显示框架this.setVisible(true);

所以构造函数结束添加

mb.setSize(300, 300);
mb.setVisible(true);
this.setVisible(true);<<<Add here

代码:

import javax.swing.*;

class Menu extends JFrame {
    JMenuBar mb;
    JMenu m1, m2, m3;
    JMenuItem mn1, mn2, mn3;
    JCheckBoxMenuItem chk1, chk2, chk3;
    JRadioButtonMenuItem rd1, rd2, rd3;
    JSeparator sp1, sp2, sp3;

    Menu() {
        setTitle("MenuBar Demo");
        mb = new JMenuBar();
        m1 = new JMenu("File");
        m2 = new JMenu("Edit");
        m3 = new JMenu("View");
        mn1 = new JMenuItem("New");
        mn2 = new JMenuItem("Open");
        mn3 = new JMenuItem("Close");
        chk1 = new JCheckBoxMenuItem("Cut");
        chk2 = new JCheckBoxMenuItem("Copy");
        chk3 = new JCheckBoxMenuItem("Paste");
        rd1 = new JRadioButtonMenuItem("Find");
        rd2 = new JRadioButtonMenuItem("Find Next");
        rd3 = new JRadioButtonMenuItem("Replace");
        sp1 = new JSeparator();
        sp2 = new JSeparator();
        sp3 = new JSeparator();
        m1.add(mn1);
        m1.add(mn2);
        m1.add(sp1);
        m1.add(mn3);
        m2.add(chk1);
        m2.add(chk2);
        m2.add(sp2);
        m2.add(chk3);
        m3.add(rd1);
        m3.add(rd2);
        m3.add(sp3);
        m3.add(rd3);
        mb.add(m1);
        mb.add(m1);
        mb.add(m2);
        mb.add(m3);
        getContentPane().add(mb);
        mb.setSize(300, 300);
        mb.setVisible(true);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new Menu();
    }

}
于 2012-06-23T11:04:21.420 回答