2012-02-16 67 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