当用户单击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();
}
});
我该怎么解决这个问题?
谢谢大家。我创建了这样一个方法:
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;
}
});
现在,它像预期的那样工作。希望很快能正确管理我的布局。再次感谢。
首先,我想正式地说,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();
}
“我该如何解决这个问题?”
> < 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。 然后是圆班 问题答案: 您有点错误的主意。在绘图面板中,您应