当前位置: 首页 > 知识库问答 >
问题:

如何在单击JButton时将不同的JPanel添加到JFrame

杭英杰
2023-03-14

当用户单击JButton时,我想将不同的JPanel添加到我的JFrame

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

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个答案

鞠鸿雪
2023-03-14

谢谢大家。我创建了这样一个方法:

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

我在每个动作观察器接口的实现中调用此方法:

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;
        }
    });

现在,它像预期的那样工作。希望很快能正确管理我的布局。再次感谢。

左宁
2023-03-14

首先,我想正式地说,peeskillet的解决方案比我将要详细说明的解决方案更优雅,并且您确实应该使用适当的布局管理器。卡布局确实非常适合这种特殊情况。

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

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

ConstituerData.this.remove(panLocal);

对于添加本地的操作监视器,将以下内容添加到第一行;

ConstituerData.this.remove(panCours);

基本上,当您放入新的JPanel时,并没有删除最后一个JPanel,这就是为什么它看起来没有变化的原因。

当我复制您的问题并解决它时,我使用了一个for循环来遍历框架的内容,并首先删除每个action监听器中的所有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(); 

    }
汪安然
2023-03-14

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

> < Li > < p > < code > set bounds(215,2,480,400)中您似乎试图添加新组件的区域,请考虑对该区域使用< code>CardLayout。只需添加一个带有< code>CardLayout的< code>JPanel作为该区域的主容器。然后,您可以:

  • 动态创建子面板,将其添加到包含面板,然后显示它,或者
  • 提前创建所有内部面板,将它们添加到包含的面板中,然后仅使用 CardLayout显示方法来显示要显示的面板。

对于将来,我建议使用布局管理器。空布局可能变得难以管理,并导致许多问题,不仅对开发人员,而且对应用程序也是如此。Swing 被设计为与布局管理器一起使用,因此请:)使用它们

有关详细信息,请参阅如何使用卡布局并在此处查看示例

有关如何使用不同的布局管理器的更多信息,请参阅在容器中布局组件。

 类似资料:
  • 我试图创建一个小的GUI,它有2个JButtons和2个JPanels,每个JPanels上都有一些绘图动画。默认情况下,它必须显示第一个JPanel,通过单击第二个JButton我想看到第二个JPanel。所以:我创建了JFrame、Panel1和Panel2,在这里我绘制了我的动画,创建了Button1和Button2,并向它们添加了ActionListeners。我还有一个MainPanel

  • 问题内容: 在NetBeans中,我已经使用GUI编辑器制作了一个JFrame,并且在框架中放置了一个JPanel。目前,我正在尝试在类构造时在面板中创建一个新按钮。这是我的代码,但似乎无法正常工作。(第一行显示该按钮,其他行尝试显示该按钮。) 我整夜都在搜寻Google,但似乎无法正常运作。 问题答案: 有时候,您看不到按钮是布局管理器问题(因为您没有为布局管理器设置正确的属性)。您可以通过禁用

  • 我正在开发一个发票系统,我想在每次单击添加新按钮时创建新字段。 每次都需要在下面的代码中添加字段。 字段需要显示在其各自的列下。 下面是我设置的按钮: 我知道这个网站上一定有答案,但我似乎找不到。 请注意,我是Java开发新手

  • 我正在尝试在程序运行期间将 JButton 添加到坐在 JFrame 中的 JPanel 中。该按钮实际上可以正常工作(可单击),但不会显示。 我已经使用setLayout(null)将框架和面板的布局都设置为null 这里可能发生了什么? 编辑:我只是尝试在面板的构造函数中简单地向jPanel添加一个jtab,但即使这样也不行…

  • 当我的JButton被点击时,我的JPanel不会出现。当我在go()方法中添加JPanel时,它确实会出现。然而,当我尝试通过单击JButton来执行它时,它并不起作用。但是,程序会进入侦听器的actionPeformed()方法的循环。

  • 问题内容: 我有一个带有按钮的Class Circle和一个带有jPanel的Class I,我想做的是单击该按钮时会在面板上绘制一个圆圈,每次我单击该按钮并更改x和y“有些不怎么实现在这里”,我一遍又一遍地在JPanel上绕了一圈。如何做到这一点,或者有一种方法可以执行我描述的内容,而不管我的代码如何,但是我希望类圈子扩展Shape。 然后是圆班 问题答案: 您有点错误的主意。在绘图面板中,您应