如何在JButton点击上向JFrame添加不同的JPanel

时间:2014-03-06 10:31:13

标签: java swing jpanel actionlistener

当用户点击JPanel时,我想向我的JFrame添加不同的JButton

Panel必须根据用户点击的按钮进行更改。这是我的代码的一部分:

addCours.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            panCours.setBounds(215, 2, 480, 400);
            panCours.setBorder(BorderFactory.createTitledBorder("Saisir les données concernant le cours"));
            ConstituerData.this.getContentPane().add(panCours);
            ConstituerData.this.revalidate();
            ConstituerData.this.repaint();
        }
    });

    addLocal.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            panLocal.setBounds(215, 2, 480, 400);
            panLocal.setBorder(BorderFactory.createTitledBorder("Saisir les données concernant le local"));
            ConstituerData.this.getContentPane().add(panLocal);
            ConstituerData.this.revalidate();
            ConstituerData.this.repaint();
        }
    });

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

  

“我该如何解决这个问题?”

  1. 您似乎尝试添加新组件的setBounds(215, 2, 480, 400)区域,请考虑为该区域使用CardLayout。只需添加JPanel CardLayout作为该区域的主要容器即可。然后你可以:

    • 动态创建子面板,将其添加到包含的面板,然后显示它,或
    • 提前创建所有内部面板,将其添加到包含的面板,然后使用show的{​​{1}}方法显示您要显示的面板。
  2. 对于未来,我建议使用布局管理器。空布局可能变得难以管理并导致许多问题,不仅对于开发人员而且对于应用程序。 Swing旨在与布局管理器一起使用,因此使用它们:)

  3. How to use Cardlayout查看更多内容并查看示例here

    有关如何使用不同布局管理器的更多信息,请参阅Laying out Components Within a Container

答案 1 :(得分:1)

首先,我想记录下peeskillet的解决方案比我要详细介绍的解决方案更优雅,并且你真的应该使用正确的layoutManager。 CardLayout对于这种特殊情况确实是完美的。

然而,如果您想要快速修复当前的困境,只需将以下内容添加到每个ActionListener的actionPerformed()覆盖的开头。

对于addCours的ActionListener,将以下内容添加到第一行;

ConstituerData.this.remove(panLocal);

对于AddLocal的ActionListener,将以下内容添加到第一行;

ConstituerData.this.remove(panCours);

基本上,当您放入新的JPanel时,您不会删除最后一个JPanel,这就是为什么它似乎没有改变。

当我复制你的问题并解决它时,我使用for循环遍历框架的内容并在每个动作监听器中首先删除所有JPanels,就像这样;

@Override
public void actionPerformed(ActionEvent e) {
        for(Component c : frame.getContentPane().getComponents()){
            if(c instanceof JPanel){
                frame.remove(c);
            }
        }
        JPanel panel = new JPanel();
        panel.setBackground(Color.RED);
        panel.setBounds(215, 2, 480, 480);
        frame.add(panel);
        frame.revalidate(); 
        frame.repaint(); 

    }

答案 2 :(得分:1)

谢谢大家。我继续创建这样的方法:

public void supprElements(JPanel jP) {
    for(Component c : this.getContentPane().getComponents()) {
        if(c instanceof JPanel) {
            if(!c.equals(jP)) {
                this.getContentPane().remove(c);
            }
        }
    }
}

我在每个ActionListener接口的实现中调用此方法:

addCours.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            supprElements(panCours);
            ConstituerData.this.getContentPane().add(panAdd);
            panCours.setBounds(215, 2, 480, 400);
            panCours.setBorder(BorderFactory.createTitledBorder("Saisir les données concernant le cours"));
            ConstituerData.this.getContentPane().add(panCours);
            ConstituerData.this.revalidate();
            ConstituerData.this.repaint();
            current = 1;
        }
    });

现在,它按预期工作。希望尽快正确管理我的布局。再次感谢。