Java 在JFrame中用JPanel替换JPanel

Java 在JFrame中用JPanel替换JPanel,java,swing,jpanel,add,Java,Swing,Jpanel,Add,我有一个扩展JFrame的类,它有一个BorderLayout。它有两个JPanel类型的私有实例变量。它们代表按钮面板,称为flipButton和confidenceButtons。单击按钮时,按钮面板将被另一个按钮面板替换。也就是说,如果单击flipButton中的某个按钮,flipButton将被信心按钮替换。我试着这样做: private class FlipListener implements ActionListener{ public void actionPerform

我有一个扩展JFrame的类,它有一个BorderLayout。它有两个JPanel类型的私有实例变量。它们代表按钮面板,称为flipButton和confidenceButtons。单击按钮时,按钮面板将被另一个按钮面板替换。也就是说,如果单击flipButton中的某个按钮,flipButton将被信心按钮替换。我试着这样做:

private class FlipListener implements ActionListener{ public void actionPerformed(ActionEvent e){ remove(flipButton); add(confidenceButtons,BorderLayout.SOUTH); validate(); ... } } private class ColorListener implements ActionListener{ ... public void actionPerformed(ActionEvent e){ ... remove(confidenceButtons); add(flipButton,BorderLayout.SOUTH); validate(); } } 私有类FlipListener实现ActionListener{ 已执行的公共无效操作(操作事件e){ 移除(翻转按钮); 添加(信心按钮,BorderLayout.SOUTH); 验证(); ... } } 私有类ColorListener实现ActionListener{ ... 已执行的公共无效操作(操作事件e){ ... 移除(信任按钮); 添加(flipButton,BorderLayout.SOUTH); 验证(); } } flipButton中的按钮具有FlipListener,而ConferenceButtons中的按钮具有ColorListener。当程序运行时,单击按钮将移除面板,但不会添加任何内容来替换它。我做错了什么

编辑

CardLayout原来是一个简单易行的解决方案。事实证明,上述代码确实有效;问题是我的代码的另一部分出现了拼写错误然而,我在使用这些方法时总是遇到困难,我发现CardLayout为我简化了这些方法。谢谢

revalidate()+repaint()应该是技巧,例如

编辑:

如果你觉得自己有这个问题,那么举一次又一次的例子,你可以自由地再次基于代码构建你的问题

另一种方法是查看Andrew Thompson添加的优秀示例:-)+1

使用a,如图所示

尝试使用getContentPane()调用remove()、add()方法等:

getContentPane().remove(flipButton); 
getContentPane().add(confidenceButtons,BorderLayout.SOUTH);   
getContentPane().revalidate();
getContentPane().repaint();
编辑: 以下代码适用于我:

import java.awt.BorderLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Frame extends JFrame {
JPanel flipButton =new JPanel();
JPanel confidenceButtons =new JPanel();



    public Frame() throws HeadlessException {
    super();
    this.setLayout(new BorderLayout());
    JButton b1=new JButton("flip");
    b1.addActionListener(new FlipListener());
    flipButton.add(b1);

    JButton b2=new JButton("color");
    b2.addActionListener(new ColorListener());
    confidenceButtons.add(b2);
    this.getContentPane().add(flipButton,BorderLayout.SOUTH);
    this.setSize(250,250);
    this.pack();
    this.setVisible(true);

}
    private class FlipListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
          remove(flipButton); 
          add(confidenceButtons,BorderLayout.SOUTH);
          validate();
          repaint();

        }
      } 
      private class ColorListener implements ActionListener{

        public void actionPerformed(ActionEvent e){

          remove(confidenceButtons); 
          add(flipButton,BorderLayout.SOUTH);
          validate();
          repaint();
        }
      }
    /**
     * @param args
     */
    public static void main(String[] args) {
        new Frame();

    }

}

我看了这个例子,但不太明白。既然我不使用图形,为什么需要重新绘制?我会在自信按钮上调用这三种方法吗?这个例子看起来非常具体,我真的不知道如何使它适应我的代码。+1请看这一点。@Shelley的例子是具体的avourt revalidate+validate+repaint,回到questin about repaint(),在大多数情况下GUI工作正常,repaint()不需要GUI;嗯,目前还没有关于这个的任何Swing教程或详细描述:-)@mKorbel我试过这个:all.remove(flipButton);全部.add(信心按钮,BorderLayout.SOUTH);all.validate();全部。重新验证();全部。重新绘制();其中all是一个JPanel,它的borderlayout包含所有内容。我知道有点不对劲。。。但我应该键入什么才能使其正确?@Shelley你能把你的问题翻译成代码吗,看起来垃圾神发布的链接是最好的基础,然后编辑你的问题也是我的第一个想法。Cardlayout是为这个用例设计的,它是最好的可维护选择。如果你能发布完整的JFrame类代码,我可以尝试修复它。也许可以尝试使用其他布局而不是BoredLayout。b/c边界布局有时会导致一些奇怪的行为,我认为这不重要。我了解到,当单独调用add、remove等方法时,它们会自动添加到内容窗格中,因此getContentPane()是不必要的。我尝试使用CardLayout,现在效果很好(CardLayout被证明是一个简单的解决方案)。谢谢你的帮助。我已经用我编写和测试的代码部分编辑了我的答案,这对我来说很好。这就是你需要的吗?我刚刚在我的代码中发现了一个打字错误,所有的事情中,这可能是我之前遇到的问题的原因。解决了这个问题后,现在就可以工作了。非常感谢。