元素不会出现在具有GridLayout或FlowLayout的Panel中,但是使用setBounds

时间:2016-03-27 14:30:11

标签: java swing jpanel layout-manager

我正在做一个由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();
        }
    });

2 个答案:

答案 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一样制作自定义容器并将其添加到框架中。

(你为什么要画一幅画而不是一张纸?)