3

フレームに 2 つのパネルがあり、上部にメニュー バーがあるアプリを作成しています。メニューバーは問題なく表示され、これまでに設定されたアクションはすべて機能しますが、他の 2 つのパネルは表示されません。

フレームに追加するすべてのパネルとラインを再トレースしようとしましたが、エラーが見つかりません。

表示されない 2 つのペインのうち最初の drawForm() メソッドのフォームは、コンポーネントを追加する前に表示されましたが、コンポーネントを再度削除しても表示されません。

クラスフレームは次のとおりです。

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Frame {
    public static void drawFrame(){
        // Create frame
        JFrame frame = new JFrame("Frame");
        // Set default close operation
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Set frame attributes
        frame.setVisible(true);
        frame.setSize(400, 300);
        frame.setResizable(false);
        // Set Layout
        frame.setLayout(new BorderLayout());
        // Add Components
        frame.add(drawMenuBar(), BorderLayout.NORTH);
        JPanel twinPane = new JPanel();
            frame.add(twinPane, BorderLayout.CENTER);
            twinPane.setLayout(new GridLayout(1, 2));
            twinPane.add(drawForm());
            twinPane.add(drawInfo());
    } // Ends method drawFrame

    public static JMenuBar drawMenuBar(){
        //Create menu structure
        JMenuBar menu = new JMenuBar();
            JMenu file = new JMenu("File");
                JMenuItem clear = new JMenuItem("Clear");
                JMenuItem calculate = new JMenuItem("calculate");
                JMenuItem exit = new JMenuItem("Exit");
            JMenu help = new JMenu("Help");
                JMenuItem about = new JMenuItem("About");
                JMenuItem instructions = new JMenuItem("Instructions");
        //Add menu items to repective area of menu tree
        menu.add(file);
            file.add(clear);
            file.add(calculate);
            file.add(exit);
        menu.add(help);
            help.add(about);
            help.add(instructions);
        //Add ActionListener
        exit.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                MainApp app = new MainApp();
                app.exit();
            }

        });
        //Set Return
        return menu;
    } // Ends method drawMenuBar

    public static JPanel drawForm(){
        //Set panel with layout and border
        JPanel form = new JPanel();
        form.setBorder(BorderFactory.createTitledBorder("Form"));
        form.setLayout(new BoxLayout(form, BoxLayout.PAGE_AXIS));
        //Create field and labels for form panel and add to form panel
        JLabel label1 = new JLabel("text1");
            form.add(label1);
        JTextField textfield1 = new JTextField(5);
            form.add(textfield1);
        JLabel label2 = new JLabel("text2");
            form.add(label2);
        JTextField textfield2 = new JTextField(5);
            form.add(textfield2);
        JButton calc = new JButton("calculate");
            form.add(calc);
        JTextField result = new JTextField(5);
            form.add(result);
        //Set return
        return form;
    } // Ends method drawForm

    public static JPanel drawInfo(){
        //Set Panel with layout and border
        JPanel info = new JPanel();
        info.setBorder(BorderFactory.createTitledBorder("Information"));
        //Set Return
        return info;
    } // Ends method drawInfo

} // Ends class Frame

main メソッドは別のクラスにありますが、クラス Frame が GUI を作成します。フレームとメニュー バーは完全に機能しますが、それ以降は何もしません。

助けていただければ幸いです、ありがとう

ジョシュ

4

3 に答える 3

5

コンポーネントをコンテナに追加するとき、それらを可視化するためにコンテナ階層を無効にする必要があるかもしれません...

問題は、何かを追加する前にフレームを表示するように設定すると強調表示されます...

public static void drawFrame(){
    // Create frame
    JFrame frame = new JFrame("Frame");
    // Set default close operation
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // Set frame attributes

    // !! Don't do this here...
    //frame.setVisible(true);
    // ... IMHO, better to use pack...
    //frame.setSize(400, 300);
    frame.setResizable(false);
    // Set Layout
    frame.setLayout(new BorderLayout());
    // Add Components
    frame.add(drawMenuBar(), BorderLayout.NORTH);
    JPanel twinPane = new JPanel();
    frame.add(twinPane, BorderLayout.CENTER);
    twinPane.setLayout(new GridLayout(1, 2));
    twinPane.add(drawForm());
    twinPane.add(drawInfo());

    // !! Do it here instead...
    frame.pack();
    frame.setVisible(true);
} // Ends method drawFrame
于 2013-09-23T00:14:08.550 に答える
2

コンポーネントを追加する前に、JFrame を可視に設定しています。そうしないでください。コンポーネント、JFrame を追加してから、pack()それを可視に設定します。

しかし、あなたが受け取るかもしれない回答に関係なく、あなたの質問は以前に度も尋ねられました:コンポーネントを追加する前に setVisible(true) を呼び出さないのはなぜですか . 質問が将来の訪問者に役立つ可能性が低いため、投票は重複として終了します。

于 2013-09-23T00:13:20.277 に答える