首页
学习
活动
专区
圈层
工具
发布

Swing执行
EN

Stack Overflow用户
提问于 2012-06-23 19:00:03
回答 3查看 107关注 0票数 2

嗨,我刚刚写了一个使用菜单栏的Swing代码。但问题出现在运行过程中。我输入:

代码语言:javascript
复制
javac Menu.java
java Menu

它未显示错误,但GUI不显示。下面是我的源码以供参考:

代码语言:javascript
复制
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没有出现?

EN

回答 3

Stack Overflow用户

发布于 2012-06-23 19:05:26

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

一般提示

  • 不扩展框架,而是保留对一个框架的引用。
  • 不要在组件上调用setVisible(true),而是将它们添加到将使其可见的容器中。菜单栏似乎没有添加到任何内容中。使用setJMenuBar(JMenuBar)
  • Don't添加它,设置组件的大小。使用适当的布局、填充和边框,然后对图形用户界面进行缩进。
  • 对代码块使用一致的逻辑缩进。正如Puce提到的,它可以帮助readability.
  • &启动和更改EDT上的GUI。

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

代码语言:javascript
复制
// ...
//getContentPane().add(mb);
setJMenuBar(mb);
//mb.setSize(300, 300);
//mb.setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
pack();
setVisible(true);
票数 4
EN

Stack Overflow用户

发布于 2012-06-23 19:06:45

使用像这样的东西:

代码语言:javascript
复制
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            Menu app = new Menu();
            app.setVisible(true);
        }
    });

}

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

票数 4
EN

Stack Overflow用户

发布于 2012-06-23 19:04:21

缺省情况下,JFrame可见性为false

您忘记显示frame this.setVisible(true);

所以构造函数add的结尾

代码语言:javascript
复制
mb.setSize(300, 300);
mb.setVisible(true);
this.setVisible(true);<<<Add here

代码:

代码语言:javascript
复制
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();
    }

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11168949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档