【问题标题】:Resizing a JPanel and its components to show hidden elements调整 JPanel 及其组件的大小以显示隐藏元素
【发布时间】:2014-12-08 23:24:19
【问题描述】:

我有一个扩展 JPanel 的类,我用它作为 GUI 来保存工人信息,包括工资,该信息在单选按钮选择的两个选项中可用。

When the first one is chosen nothing has to be done on the panel.

但是如果选择了第二个单选按钮,我们必须显示一些额外的文本字段,*问题就来了——我的面板没有调整大小以适应组件,它完全混乱。

我尝试实现观察者模式,但它不起作用或可能做错了 在这里跟随我班级的主要部分。

public class EmpDetails extends JPanel {

public EmpDetails() {

    matriculeLab = new JLabel("MATRICULE :");
    matriculeTxt = new JTextField(10);


    nomLab = new JLabel("Nom :");
    nomTxt = new JTextField(30);


    serviceLab = new JLabel("SERVICE :");
    serviceDrBx = new JComboBox<>();

    fonctionLab = new JLabel("FONCTION :");
    fonctionDrBx = new JComboBox<>();


    dateEmbLab = new JLabel("DATE D'EMBAUCHE :");
    dateEmb = DatePick.getDatePick();

    ///  This is the first radio button 

    salaireFxBtn = new JRadioButton("FIXE ");
    salaireFxBtn.setSelected(true);


    /// This is the second radio button that shows the hiden elements 

    salaireChngBtn = new JRadioButton("CHANGEANT ");


    bg.add(salaireFxBtn);
    bg.add(salaireChngBtn);

    btnPanel.setLayout(new GridLayout(2, 1));
    btnPanel.add(salaireFxBtn);
    btnPanel.add(salaireChngBtn);


    salaireLab = new JLabel("MONTANT DU SALAIRE:");
    montatSalFix = new JFormattedTextField(NumberFormat.getIntegerInstance());


    /// This is the panel holding the hidden elements its shown when radio button 2 is clicked

    salPanel.setLayout(new GridLayout(3, 2));

    salaire1 = new JLabel("MONTANT SALAIRE 1:");
    montantSal1 = new JFormattedTextField(NumberFormat.getIntegerInstance());

    salPanel.add(salaire1);
    salPanel.add(montantSal1);

    periodeLab1 = new JLabel("DUREE 1 :");
    periode1 = new JFormattedTextField(NumberFormat.getIntegerInstance());

    salPanel.add(periodeLab1);
    salPanel.add(periode1);

    salaire2 = new JLabel("MONTANT SALAIRE 2:");
    montantSal2 = new JFormattedTextField(NumberFormat.getIntegerInstance());

    salPanel.add(salaire2);
    salPanel.add(montantSal2);

    periodeLab2 = new JLabel("DUREE 2 :");
    periode2 = new JFormattedTextField(NumberFormat.getIntegerInstance());

    salPanel.add(periodeLab2);
    salPanel.add(periode2);

    salaire3 = new JLabel("MONTANT SALAIRE 3:");
    montantSal3 = new JFormattedTextField(NumberFormat.getIntegerInstance());

    salPanel.add(salaire3);
    salPanel.add(montantSal3);

    periodeLab3 = new JLabel("DUREE 3 :");
    periode3 = new JFormattedTextField(NumberFormat.getIntegerInstance());

    salPanel.add(periodeLab3);
    salPanel.add(periode3);

    salPanel.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1));
    salPanel.setVisible(false);

    indemLab = new JLabel("INDEMNITE :");
    indemnite = new JFormattedTextField(NumberFormat.getIntegerInstance());



    salaireChngBtn.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
            if (salaireChngBtn.isSelected()) {
                salPanel.setVisible(true);
            }
        }
    });

    salaireFxBtn.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
            if (salaireFxBtn.isSelected()) {
                salPanel.setVisible(false);
            }

        }
    });

    layoutComponents();
    setVisible(true);
}

private void layoutComponents() {
    setLayout(new GridBagLayout());
    GridBagConstraints gb = new GridBagConstraints();

    //   The rest is an implementation of the GridBagLayout to design the interface
    }
}

这是布局

private void layoutComponents() {
    setLayout(new GridBagLayout());
    GridBagConstraints gb = new GridBagConstraints();

    gb.fill = GridBagConstraints.NONE;
    gb.weightx = 1;
    gb.weighty = 1;
    gb.insets = new Insets(7, 7, 7, 7);

    // LINE 01 //
    gb.gridx = 0;
    gb.gridy = 0;

    add(matriculeLab, gb);
    gb.gridx++;
    add(matriculeTxt, gb);

    gb.gridx++;
    add(nomLab, gb);
    gb.gridx++;
    add(nomTxt, gb);

    // LINE 02 //
    gb.gridx = 0;
    gb.gridy = 1;

    add(serviceLab, gb);
    gb.gridx++;
    add(serviceDrBx, gb);

    gb.gridx++;
    add(fonctionLab, gb);
    gb.gridx++;
    add(fonctionDrBx, gb);

    // LINE 03 //
    gb.gridx = 0;
    gb.gridy++;

    add(dateEmbLab, gb);
    gb.gridx++;
    add(dateEmb, gb);

    // LINE 04 //
    gb.gridx = 0;
    gb.gridy++;

    add(btnPanel, gb);

    // LINE 05 //
    gb.gridx = 0;
    gb.gridy++;

    add(salaireLab, gb);
    gb.gridx++;
    add(montatSalFix, gb);



    // LINE 0 //
    gb.gridx = 0;
    gb.gridy++;

    add(salPanel, gb);

    // LINE 09 //
    gb.gridx = 0;
    gb.gridy++;

    add(indemLab, gb);
    gb.gridx++;
    add(indemnite, gb);
}

【问题讨论】:

  • 没有布局逻辑,就不可能提供任何真正的建议......
  • "如果选择 [a] 按钮...显示一些额外的文本字段"建议查看CardLayout
  • @MadProgrammer 如果您能提供更多帮助,我已经添加了布局
  • @trashgod 我去看看,谢谢

标签: java swing layout jpanel layout-manager


【解决方案1】:

我使用 CardLayout
解决了我的问题 我为它自己的 CardLayout 创建了一个 JPanel,并为每种类型的薪水创建了另外两个 JPanel
我在每个单选按钮上使用了两个动作监听器来切换到下一张卡片

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 2020-09-10
    相关资源
    最近更新 更多