2013-01-14 128 views
1

我一直在研究一个应用程序,在这个应用程序中设置了一个包含项目的类别列表,然后将其制作成文本文件。但是我为它制作的GUI并不完全适用。我认为错误位于名为Cat(或“添加类别”)的JMenuItem中,或者以我显示Categories(Update()方法)的方式出现。它应该要求一个名称,制作一个以该名称命名的类别并将其显示在JScrollPane中,但不会出现。下面是代码:GUI程序不能正常工作

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); 
     } 
    } 
} 

在此先感谢;)

+0

什么是库存和分类类? – Andremoniy

+0

一提示:从小开始。如果GUI不工作,你的代码非常大。从一个简单的例子开始,一个可以推理的小型控制代码。因此,您将学习如何使用工作代码以渐进的方式组装这些小东西来实现您想要的目标。 –

+0

Invventory是一个存储类别的类,它存储项目本身,它们将显示在gUI中。而实际上唯一不起作用的是目前的“添加类别”:) – lazyboy007

回答

4

您需要添加JTextPane nameJPanel 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);  
    } 
+0

是的主要方法是在另一个文件,只是调用去();) – lazyboy007

+0

哦,是的,这是愚蠢的。虽然;) – lazyboy007

+0

那么,即使在添加JTextPane后它仍然不显示任何东西 – lazyboy007

2

这可能是更好的初始化inv你展示JFrame之前。你
也应该调换声明

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

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

所以没有加入你的JScrollpane后需要重新绘制。已经显示组件的时候添加组件是非常棘手的。
我真的推荐你用frame.setVisible(true);来结束你的方法,甚至把这个语句提取到一个自己的方法中,当go()完成时调用它。
...那么,最好将go()重命名为init(),但那是另一回事;)。分开构建和展示框架是我眼中的一个好习惯。
编辑: 重新读你的代码后,我看不到你的JScrollpane被填充。你在哪里添加一些东西?
你也应该阅读关于Java Coding Conventions作为属性不应该以大写字母开头。这会提高你的代码的可读性。

+0

好,非常感谢,我会尝试。 JScrollPane被填充到Update()方法中。我根本不知道这些约定,所以再次感谢;) – lazyboy007