1

我一直在开发一个应用程序,您可以在其中设置包含项目的类别列表,然后将其制成文本文件。但是我为它制作的 GUI 并不能完全正常工作。我认为错误位于名为 Cat(或“添加类别”)的 JMenuItem 中,或者位于我显示类别的方式中(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可以构造 a 的方法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. 在您的组件已经显示时添加组件是非常棘手的。
我真的建议你用这个语句结束你的方法,frame.setVisible(true);甚至将这个语句提取到一个自己的方法中,该方法在go()完成时被调用。
...好吧,那么最好重命名go()init(),但那是另一回事;)。在我看来,将构建和显示框架分开是一种很好的做法。
编辑: 重新阅读您的代码后,我看不到您JScrollpane的填写位置。你在哪里添加一些东西?
您还应该阅读Java 编码约定,因为属性不应以大写字母开头。这将大大提高您代码的可读性。

于 2013-01-14T19:54:53.800 回答