2013-01-14 180 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