当用户点击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();
}
});
我该如何解决这个问题?
答案 0 :(得分:2)
“我该如何解决这个问题?”
您似乎尝试添加新组件的setBounds(215, 2, 480, 400)
区域,请考虑为该区域使用CardLayout
。只需添加JPanel
CardLayout
作为该区域的主要容器即可。然后你可以:
show
的{{1}}方法显示您要显示的面板。对于未来,我建议使用布局管理器。空布局可能变得难以管理并导致许多问题,不仅对于开发人员而且对于应用程序。 Swing旨在与布局管理器一起使用,因此使用它们:)
在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;
}
});
现在,它按预期工作。希望尽快正确管理我的布局。再次感谢。