2012-02-16 87 views
0

我已閱讀了許多關於此主題的主題和問題,但似乎無法找到解決問題的可行解決方案。下面是用於添加和刪除組件的方法的代碼。動態刪除JPanel

public void addAuxPanel (String pType, int pStart, int pEnd) { 

    int id = mPanels.size(); 
    int xPos = PANEL_START_X; 
    int yPos = PANEL_START_Y + (PANEL_HEIGHT * id) + 15; 

    if (id == 0) { 
     xPos = PANEL_START_X; 
    } 

    String type = pType; 
    int start = pStart; 
    int end = pEnd; 

    AuxPanel p = new AuxPanel(type, start, end, id, this); 
    mPanels.add(p); 

    p.setBounds(xPos, yPos, 300, 25); 

    getRootPane().add(p); 
    getRootPane().repaint(); 
    getRootPane().revalidate(); 
} 

public void removeAuxPanel (AuxPanel pPanel) { 

      getRootPane().remove(pPanel); 
      getRootPane().revalidate(); 
      getRootPane().repaint(); 

} 
+0

爲了更好的幫助更快,發佈[SSCCE](http://sscce.org/)。 *「..沒有佈局來獲取我想要的面板上的元素。」*這可能是問題的核心。一旦佈局結束,期待各種各樣的驚喜。使用帶填充的佈局和組件的邊界來實現完全適合屏幕和PLAF的佈局,*和* robust。 – 2012-02-16 19:13:51

回答

1

如何致電panel.setVisible (false)

+0

面板需要在運行時添加和刪除,而不是僅設置爲可見或不可見。這個想法是,如果用戶單擊圖像,它將從它存儲在的JPanel中移除。 – Prmths 2012-02-16 18:46:37

+0

應該是最有效的方式+1 – mKorbel 2012-02-16 18:47:38

+0

@strangeInAStrangerLand將圖像作爲圖標添加到JLabel,有任何原因,請閱讀相關內容教程http://docs.oracle.com/javase/tutorial/uiswing/components/icon.html和http://docs.oracle.com/javase/tutorial/uiswing/components/label.html – mKorbel 2012-02-16 18:49:50

2

你可以簡單地做frameObject.remove(yourPanel);

不是做你的正常重新驗證()和重繪()。

您的幫助這裏的一個小代碼:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class TwoPanels extends JFrame { 

    public TwoPanels() { 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     final JPanel panel1 = new JPanel(); 
     panel1.setBackground(Color.RED); 
     final JPanel panel2 = new JPanel(); 
     panel2.setBackground(Color.BLUE); 

     JButton button = new JButton("ADD AND REMOVE PANEL"); 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       if (panel1.isShowing()) { 
        remove(panel1); 
        add(panel2, BorderLayout.CENTER); 
        revalidate(); 
        repaint(); 
       } else if (panel2.isShowing()) { 
        remove(panel2); 
        add(panel1, BorderLayout.CENTER); 
        revalidate(); 
        repaint(); 
       } 
      } 
     }); 

     add(panel1, BorderLayout.CENTER); 
     add(button, BorderLayout.PAGE_END); 

     pack(); 
     setLocationByPlatform(true); 
     setVisible(true); 
    } 

    public static void main(String... args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TwoPanels(); 
      } 
     }); 
    } 
} 

如果你想從JPanel中刪除組件,看到這個代碼刪除()仍然可以工作,這樣的:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class TwoPanels extends JFrame { 

    public TwoPanels() { 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     final JPanel panel1 = new JPanel(); 
     final JLabel label = new JLabel("I am a JLabel"); 
     panel1.setBackground(Color.WHITE); 
     panel1.add(label); 

     JButton button = new JButton("ADD AND REMOVE PANEL"); 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       if (label.isShowing()) { 
        panel1.remove(label); 
        panel1.revalidate(); 
        panel1.repaint(); 
       } else { 
        panel1.add(label); 
        panel1.revalidate(); 
        panel1.repaint(); 
       } 
      } 
     }); 

     add(panel1, BorderLayout.CENTER); 
     add(button, BorderLayout.PAGE_END); 

     pack(); 
      setLocationByPlatform(true); 
     setVisible(true); 
    } 

    public static void main(String... args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TwoPanels(); 
      } 
     }); 
    } 
} 
+0

謝謝,回覆。當我只調用remove()時,該對象不會從JPanel中刪除。據我所知,revalidate()用於獲取容器重繪。我還應該提到容器是一個子類JPanel,沒有佈局,因爲我使用WindowBuilder,沒有佈局來獲取我想要的面板上的元素。我知道這是令人不悅的,但坦白地說,如果這些課程不那麼笨拙,我很樂意使用它們。 – Prmths 2012-02-16 19:02:02

+0

@strangeInAStrangerLand:你想刪除JPanel或JPanel上的東西? – 2012-02-16 19:04:56

+0

我有一個對象,它是JPanel的一個子類,我想從另一個也是JPanel子類的對象中移除。容器添加並刪除子類。我在每個監聽子類的偵聽器中查看它是否被單擊,如果是,它會調用容器的remove方法。 – Prmths 2012-02-16 19:08:00