我正在做一个由JFrame中的多个面板组成的程序。 我需要在不同的类中做每一个元素(因为在我的学校,我们需要在不同的类中将每个元素分别用于干净的代码),但是我看到的每个例子都有我的问题,他们做了一切在一堂课。 我认为我的问题来自多课程,所以我向你展示了我的课程。
我有一个面板,我需要放2个面板,这里是代码:
public class Inscription extends JPanel{
private PanneauBoutons panneauBoutons = new PanneauBoutons();
private PanneauFormulaire panneauFormulaire = new PanneauFormulaire();
public Inscription(){
this.setLayout(new BorderLayout());
this.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
this.add(panneauFormulaire,BorderLayout.CENTER);
this.add(panneauBoutons,BorderLayout.SOUTH);
this.setVisible(true);
}
}
这是Panel panneauFormulaire:
public class PanneauFormulaire extends JPanel{
private JLabel labelMatricule;
private JTextField zoneTexteMatricule;
public PanneauFormulaire(){
this.setLayout(new GridLayout(8,2,10,10));
this.setBorder(BorderFactory.createLineBorder(Color.black));
labelMatricule = new JLabel("Matricule : ");
this.add(labelMatricule);
zoneTexteMatricule = new JTextField(30);
this.add(zoneTexteMatricule);
this.setVisible(true);
}
所以如果我不做setBounds,问题铭文不会出现在主框架上,但我想要一个BorderLayout ...... (我测试过并且设置了一个边界,我可以看到边框,所以我认为这意味着面板真的被添加到了Frame中,所以为什么没有setBounds我看到了什么?)。 另一个问题是PanneauFormulaire小组没有出现在铭文小组......
所以如果我错过了什么,你能帮助我吗?谢谢
这里是扩展JFrame的类:
public class FenetrePrincipale extends JFrame {
private Container cont;
private Inscription inscriptionForm;
public FenetrePrincipale(){
super("IESN");
setBounds(100,100,1200,960);
getContentPane().setLayout(null);
setLocationRelativeTo(null);
setResizable(false);
...
inscription.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
cont.removeAll();
inscriptionForm = new Inscription();
inscriptionForm.setOpaque(true);
cont.add(inscriptionForm);
invalidate();
repaint();
}
});
答案 0 :(得分:1)
您不应该使用null布局和setBounds()。 Swing旨在与布局管理器一起使用。
但是当我点击菜单中的某个选项时,当前面板需要另外更改一个
然后你应该使用CardLayout
。
阅读How to Use CardLayout上Swing教程中的部分以获取工作示例。因此,下载示例并将其用作项目的起点。代码将比您当前拥有的结构更好,并且更改工作代码比修复损坏的代码更容易。
答案 1 :(得分:1)
那么为什么没有setBounds我看到了什么?
这是因为您在rtl
中将布局设置为null
。
Java容器附带一个默认布局,您可以将其设置为另一个布局。组件在容器中的排列方式取决于您使用的布局。布局将直接影响组件的位置,对齐,间距,尺寸,preferredSize。
但是,如果您选择不使用任何布局(getContentPane().setLayout(null);
)。 Swing不知道您希望如何排列组件,因此您在内容窗格中看不到任何内容。
因为你想要"绝对控制"在组件上,您需要自己设置每个添加组件的边界(位置和尺寸) 手动 。这就是为什么你没有看到任何组件(即使你已经添加它),直到你为它们设置边界。
Java,元素不会出现在具有GridLayout或FlowLayout的Panel中,但是它们会带有setBounds
每个布局都有自己的特点,对于其中一些布局,代码的顺序确实有所不同。因此,我会建议您仔细阅读每种布局可以为您做的事情。然后,根据您的需要,选择一个(或几个的组合)并研究如何使用它。
这里是扩展JFrame的类:
您可能不想扩展到JFrame。您始终可以像JPanel一样制作自定义容器并将其添加到框架中。
(你为什么要画一幅画而不是一张纸?)