1

私はアプリに取り組んでいます。このアプリでは、アイテムを含むカテゴリのリストを設定し、それをテキストファイルに変換します。しかし、私が作成したGUIは完全には機能しません。エラーは、Cat(または「カテゴリの追加」)と呼ばれるJMenuItemにあるか、Categoriesの表示方法(Update()メソッド)にあると思います。名前を尋ね、それにちなんで名付けられたカテゴリを作成し、それをJScrollPaneに表示することになっていますが、何も表示されません。コードは次のとおりです。

public class GUIBuilder {
    public JFrame frame;
    public JPanel LeftPanel;
    public JPanel RightPanel;
    public JScrollPane scroll;
    public JMenuBar bar;
    public JMenu File;
    public JMenu Add;
    Inventory inv;

    public void go() {
        frame = new JFrame();

        scroll = new JScrollPane();

        bar = new JMenuBar();
        File = new JMenu("File");
        Add = new JMenu("Add...");
        bar.add(File);
        bar.add(Add);

        JMenuItem Save = new JMenuItem(new AbstractAction("Save") {
            private static final long serialVersionUID = 1L;

            public void actionPerformed(ActionEvent arg0) {

            }
        });
        JMenuItem Load = new JMenuItem(new AbstractAction("Load") {
            private static final long serialVersionUID = 1L;

            public void actionPerformed(ActionEvent arg0) {

            }
        });
        JMenuItem Generate = new JMenuItem(new AbstractAction("Generate Text File") {
            private static final long serialVersionUID = 1L;

            public void actionPerformed(ActionEvent arg0) {

            }
        });
        File.add(Save);
        File.add(Load);
        File.add(Generate);

        JMenuItem Cat = new JMenuItem(new AbstractAction("Add Category") {
            private static final long serialVersionUID = 1L;
            JFrame Cat;

            public void actionPerformed(ActionEvent arg0) {
                Cat = new JFrame("Add Category");
                final JTextField name = new JTextField(15);
                JButton Submit = new JButton(new AbstractAction("Submit") {
                    private static final long serialVersionUID = 1L;

                    public void actionPerformed(ActionEvent arg0) {
                        String n = name .getText();
                        if (n != null) {
                            inv.addCategory(new Category(n));
                            pullThePlug();
                            GUIBuilder.this.Update();
                        }
                    }
                });
                Cat.setLayout(new BorderLayout());
                Cat.add(name, BorderLayout.CENTER);
                Cat.add(Submit, BorderLayout.SOUTH);
                Cat.setSize(250, 150);
                Cat.setVisible(true);
            }
            public void pullThePlug() {
                WindowEvent wev = new WindowEvent(Cat, WindowEvent.WINDOW_CLOSING);
                Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
            }
        });
        JMenuItem item = new JMenuItem(new AbstractAction("Add Item") {
            private static final long serialVersionUID = 1L;

            public void actionPerformed(ActionEvent arg0) {

            }
        });
        Add.add(Cat);
        Add.add(item);

        frame.setJMenuBar(bar);
        frame.setSize(500, 800);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.add(scroll);

        inv = new Inventory();
    }

    public void Update() {
        for (int i = 0; i < inv.categories.size(); i++) {
            Category cat = inv.categories.get(i);
            JPanel p = new JPanel();
            JTextPane name = new JTextPane();
            name.setText(cat.getName());
            scroll.add(p);
        }
    }
}

前もって感謝します ;)

4

2 に答える 2

4

に を追加する必要がありJTextPane nameますJPanel p

(また、-mainを構築するメソッドが欠落しているように思えGUIBuilderますが、それは質問で示していない別のファイルにあるのでしょうか?)


また、空JScrollPaneの を作成する場合は、 を介してコンポーネントを追加する必要がありますscrollpane.getViewport().add(yourcomponent);

また、レイアウト管理も必要です。最も簡単な方法(そしておそらくあなたが意図したこと)は次のとおりです。

    public void Update() {
        JPanel p = new JPanel();
        for (int i = 0; i < inv.categories.size(); i++) {
            Category cat = inv.categories.get(i);
            JTextPane name = new JTextPane();
            p.add(name);        
            name.setText(cat.getName());                
        }
        scroll.getViewport().add(p);       
    }
于 2013-01-14T19:16:46.063 に答える
2

invを表示する前に初期化したほうがよい場合がありますJFrame
また、ステートメントを交換する必要があります

frame.setVisible(true);
frame.add(scroll);

frame.add(scroll);
frame.setVisible(true);

したがって、追加後に再描画する必要はありませんJScrollpane。コンポーネントがすでに表示されているときにコンポーネントを追加するのは非常に難しいです。メソッドを終了するか、終了時に呼び出される独自のメソッドにこのステートメントを抽出する
ことを強くお勧めします。 ...それなら、名前を に変更したほうがよいでしょうが、それは別のことです ;)。フレームの作成と表示を分割することは、私の目には良い習慣です。編集:あなたのコードを読み直した後、あなたがどこで満たされている のかわかりません。どこに何かを追加しますか? また、属性は大文字で始めてはならないため、 Java コーディング規則についても読む必要があります。これにより、コードの可読性が大幅に向上します。frame.setVisible(true);go()
go()init()
JScrollpane

于 2013-01-14T19:54:53.800 に答える