2011-06-29 92 views
8

我是Java Swing的新手。我對Swing中的動態組件有些疑問。java swing動態添加組件

基本上我甲肝一個主要JPanel包括兩個子JPanel(leftpanel和rightpanel)的神韻:horizo​​ntally.In離開JPanel我甲肝一些JButtons,我會點擊JButton我NEDD表現出一定的JLabelJTextArea等右JPanel 。我嘗試了一個代碼,但它不工作。當我點擊按鈕時,它將進入事件監聽器功能,但JLabel我無法查看。

我在下面給我的代碼。請看看這個,糾正我。在此先感謝

package my; 

    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import javax.swing.BoxLayout; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 
    import javax.swing.SwingUtilities; 

    /** 
    * 
    * @author root 
    */ 

    public class myAplliwithPanel extends JFrame{ 

     JPanel rightPanel; 

     public myAplliwithPanel() { 
      initGui(); 
     }   

     public void initGui() 
     { 
      JPanel mainPanel=new JPanel(); 
      mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.X_AXIS)); 

      JPanel leftPanel=new JPanel(); 
      leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS)); 

      rightPanel=new JPanel(); 
      rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS)); 

      JButton dbBut=new JButton("DB"); 
      JButton appliBut=new JButton("Appli"); 
      appliBut.addActionListener(new ActionListener() { 

       public void actionPerformed(ActionEvent arg0) { 
        JLabel label=new JLabel("dsggs"); 
        rightPanel.add(label); 
       } 
      }); 

      JButton backendBut=new JButton("Backend"); 

      leftPanel.add(dbBut); 
      leftPanel.add(appliBut); 
      leftPanel.add(backendBut);  

      mainPanel.add(leftPanel); 
      mainPanel.add(rightPanel); 

      add(mainPanel); 

      setTitle("System Manger"); 
      setSize(400, 400); 
      setLocationRelativeTo(null); 
      setDefaultCloseOperation(EXIT_ON_CLOSE); 


     } 

    public static void main(String args[]) { 
      SwingUtilities.invokeLater(new Runnable() { 

       public void run() { 
        myAplliwithPanel myObj = new myAplliwithPanel(); 
        myObj.setVisible(true); 
       } 
      }); 
     } 
    } 
+1

我edided您的文章,請回復,如果不更新UI ... – mKorbel

回答

19

你需要調用revalidate添加(或刪除)的組件後:

rightPanel.add(label); 
rightPanel.revalidate(); 

應該做的伎倆。

+0

thnks人你們救了我 – nantitv

+0

我試過'validate', 'invalidate','getParent()。invalidate()'在我搜索之前,現在找到'revalidate()'。最後是**有效**的東西! –

+0

我也試過invalidate,repaint,getParent()。invalidate()/ repaint()(和兩者一起),但它只是沒有辦法。我的問題是我從JPanel中刪除所有組件,然後重新添加它們,當我最小化/調整窗口大小時,它們確實出現,就像我希望的那樣。在面板上重新驗證(),你正在添加組件,也爲我做了竅門。謝謝! – Igor

11

呼叫

rightPanel.revalidate(); 
rightPanel.repaint(); 

將你添加的標籤

rightPanel.updateUI後

+0

這是正確的我刪除了我的文章+1 – mKorbel

+0

thnks男人其工作正常 – nantitv

3

剛加入這一行()之後;

,當你在運行時添加任何成分,你需要使用這種方法

+0

感謝大家這樣一個快速的回覆,它的工作很好 – nantitv

+0

'updateUI'是關於外觀和感覺,而不是佈局。 –

+0

我在說什麼?我正在談論UI,而不是特定的佈局UI意味着外觀和感覺。請不要像這樣給負面的標記小心這一點。 – Pratik