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 に答える