0

このように宣言されたときに JPanel を参照する方法がわかりません。

これはプログラム全体のコーディングです。すべてが機能しますが、レイアウトが希望どおりではありません。それにBorderLayoutsを追加してもうまくいかないようです。

class FrameDemo
{
    public static void main(String[] args)
    {
        final JFrame frame = new JFrame("CIT Test Program");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(350, 250));
        frame.add(new JPanel()
        {{
            String[] tests = {"A+ Certification", "Network+ Certification", "Security+ Certification", "CIT Full Test Package"};
            JComboBox comboBox = new JComboBox(tests);
            TextArea text = new TextArea(5,10);
            add(new JLabel("Welcome to the CIT Test Program "));
            add(new JLabel("Please select which Test Package from the list below."));

            JMenuBar menuBar = new JMenuBar();
            JMenu fileMenu = new JMenu("File");
            JMenu editMenu = new JMenu("Edit");
            JMenu helpMenu = new JMenu("Help");
            menuBar.add(fileMenu);
            menuBar.add(editMenu);
            menuBar.add(helpMenu);
            JMenuItem newMenu = new JMenuItem("New  (Ctrl+N)");
            JMenuItem openMenu = new JMenuItem("Open  (Ctrl+O)");
            JMenuItem saveMenu = new JMenuItem("Save  (Ctrl+S)");
            JMenuItem exitMenu = new JMenuItem("Exit  (Ctrl+W)");
            JMenuItem cutMenu = new JMenuItem("Cut  (Ctrl+X)");
            JMenuItem copyMenu = new JMenuItem("Copy  (Ctrl+C)");
            JMenuItem pasteMenu = new JMenuItem("Paste  (Ctrl+V)");
            JMenuItem infoMenu = new JMenuItem("Help  (Ctrl+H)");
            fileMenu.add(newMenu);
            fileMenu.add(openMenu);
            fileMenu.add(saveMenu);
            fileMenu.add(exitMenu);
            editMenu.add(cutMenu);
            editMenu.add(copyMenu);
            editMenu.add(pasteMenu);
            helpMenu.add(infoMenu);
            this.add(comboBox, BorderLayout.NORTH);
            this.add(text, BorderLayout.SOUTH);
            frame.setJMenuBar(menuBar);
            add(new JButton("Select")
            {{
                addActionListener(new ActionListener()
                {
                    public void actionPerformed(ActionEvent e )
                    {
                        frame.dispose();
                        JOptionPane.showMessageDialog(frame,"IT WORKS!");

                    }
                });
            }});
        }});
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );

    }
}

JPanel を参照して BorderLayout を使用する方法がわかりません。どうすればこれを行うことができますか?

4

3 に答える 3

2

パネルをJFrameに追加する場合(add()ここで行っているように使用)、パネルがとして追加されていると見なすことができますcontentPanel。ただし、明示的にする方がはるかに優れています。これの代わりに:

frame.add(new JPanel()
{}

これを使って:

JPanel panel = new JPanel(new BorderLayout());
// add your stuff to the panel;
frame.add(panel);

編集:

編集内容を確認すると、匿名クラスを初期化していることが明らかです。これは一般的に悪い習慣ではありませんが、ここでは多くの初期化コードを配置しています。入力するコードは二重括弧で囲まれたブロックにあり、本質的には静的初期化子に配置されます。通常の匿名クラスのように見えますが、実際にはそうではありません。それだけのコードで、それはそれ自身のクラスに値します。新しいクラスをコーディングするところまで行った場合は、問題ないはずです。次に、それをの拡張として定義しJPanel、独自のコンストラクターでanew BorderLayout()をに渡すことをお勧めしますsuper

編集2:

名前の付いた新しいファイル/クラスを作成し、次のBarようにコーディングした場合:

public class Bar extends JPanel {
    public Bar(final JFrame frame) {
        String[] tests = { "A+ Certification", "Network+ Certification",
                "Security+ Certification", "CIT Full Test Package" };
        JComboBox comboBox = new JComboBox(tests);
        TextArea text = new TextArea(5, 10);
        add(new JLabel("Welcome to the CIT Test Program "));
        add(new JLabel("Please select which Test Package from the list below."));

        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");
        JMenu editMenu = new JMenu("Edit");
        JMenu helpMenu = new JMenu("Help");
        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        menuBar.add(helpMenu);
        JMenuItem newMenu = new JMenuItem("New  (Ctrl+N)");
        JMenuItem openMenu = new JMenuItem("Open  (Ctrl+O)");
        JMenuItem saveMenu = new JMenuItem("Save  (Ctrl+S)");
        JMenuItem exitMenu = new JMenuItem("Exit  (Ctrl+W)");
        JMenuItem cutMenu = new JMenuItem("Cut  (Ctrl+X)");
        JMenuItem copyMenu = new JMenuItem("Copy  (Ctrl+C)");
        JMenuItem pasteMenu = new JMenuItem("Paste  (Ctrl+V)");
        JMenuItem infoMenu = new JMenuItem("Help  (Ctrl+H)");
        fileMenu.add(newMenu);
        fileMenu.add(openMenu);
        fileMenu.add(saveMenu);
        fileMenu.add(exitMenu);
        editMenu.add(cutMenu);
        editMenu.add(copyMenu);
        editMenu.add(pasteMenu);
        helpMenu.add(infoMenu);
        this.add(comboBox, BorderLayout.NORTH);
        this.add(text, BorderLayout.SOUTH);
        frame.setJMenuBar(menuBar);
        add(new JButton("Select") {
            {
                addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        frame.dispose();
                        JOptionPane.showMessageDialog(frame, "IT WORKS!");

                    }
                });
            }
        });

    }

それを使用するためにあなたがする必要があるのは、電話することだけです

  JPanel panel = new Bar(frame);

ただし、ここでの目標はを使用することなBorderLayoutので、次の呼び出しを開始することをお勧めします。

 public Bar(final JFrame frame) {
        super(new BorderLayout());
        .... everything else
 }
于 2010-06-17T05:32:33.860 に答える
1

すでに与えられたすべての回答に加えて...あなたのプログラムには根本的な欠陥があります。Swing コンポーネントのすべての操作は、EDT スレッドで行う必要があります。したがって、コードはわずかに異なるはずです

class FrameDemo
{
    public static void main(String[] args)
    {
         SwingUtilities.invokeLater( new Runnable() {
                 void run() {
                    /// your code here
                 }    
         }); 
    }
}

そうでなければ、何が起こるかは予測できません。詳細については、http://www.javaworld.com/javaworld/jw-08-2007/jw-08-swingthreading.htmlを参照してください。

于 2010-06-17T17:41:10.143 に答える
0

それに追加BorderLayoutしてもうまくいかないようです。

フレームのサイズを変更するとわかるようJPanelに、 new のデフォルトのレイアウトは です。FlowLayout違いを確認するには、置き換えます

frame.add(new JPanel()

frame.add(new JPanel(new BorderLayout())

@akf が示唆するように、二重中括弧を使用した長い静的初期化はあいまいになる可能性があります。

于 2010-06-17T14:17:00.710 に答える