根据我的jcombobox中的值加载不同的JPanel

时间:2013-04-06 01:26:52

标签: java swing jpanel jcombobox

我有一个JFrame包含一个JPAnel“painelGeral”和一个JComboBox cmbTipo(values = Aluno和Funcionario),我还有另外两个JPanels:painelAluno和painelFuncionario,我希望其中一个显示在“painelGeral”下面取决于我的JComboBox cmbTipo中的所选项目。 更确切地说,如果我选择的JComboBox(cmbTipo)的值是'Aluno',那么painelAluno将显示在painelGeral下,如果我选择的JComboBox(cmbTipo)的值是'Funcionario',那么将显示painelFuncionario 这是我到目前为止尝试过的代码:

package view;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MembrosView extends JFrame implements ActionListener {
    private JButton btnAdicionar, btnCancelar;
    private JLabel lblTipo, lblNome, lblEmail, lblCelular, lblRa, lblCurso,
            lblHabilitado, lblCpf, lblEndereco, lblNumero, lblComplemento;
    private JTextField txtNome, txtEmail, txtCelular, txtRa, txtCpf,
            txtEndereco, txtNumero, txtComplemento;
    private JPanel painelPrincipal, painelBotoes, painelGeral, painelAluno,
            painelFuncionario;
    private String[] tipos = { "Aluno", "Funcionário" };
    private JComboBox cmbTipo, cmbCurso;
    private JCheckBox ccbHabilitado;

    public MembrosView() {
        super("Manutenção de Membros");
        btnAdicionar = new JButton("Adicionar");
        btnCancelar = new JButton("Cancelar");

        // geral
        lblNome = new JLabel("Nome:");
        lblEmail = new JLabel("Email:");
        lblCelular = new JLabel("Celular:");
        lblTipo = new JLabel("Tipo:");

        // aluno
        lblRa = new JLabel("RA:");
        lblCurso = new JLabel("Curso:");
        lblHabilitado = new JLabel("Habilitado:");

        // professor
        lblCpf = new JLabel("CPF:");
        lblEndereco = new JLabel("Endereço");
        lblNumero = new JLabel("Número:");
        lblComplemento = new JLabel("Complemento:");

        // geral
        txtNome = new JTextField(20);
        txtEmail = new JTextField(20);
        txtCelular = new JTextField(20);

        // aluno
        txtRa = new JTextField(20);
        cmbTipo = new JComboBox(tipos);
        ccbHabilitado = new JCheckBox();
        cmbCurso = new JComboBox();
        // habilitado é checkbox

        // professor
        txtCpf = new JTextField(20);
        txtEndereco = new JTextField(20);
        txtNumero = new JTextField(20);
        txtComplemento = new JTextField(20);

        // botoes
        btnAdicionar.addActionListener(this);
        btnCancelar.addActionListener(this);
        cmbTipo.addActionListener(this);

        painelPrincipal = new JPanel();
        painelAluno = new JPanel();
        painelFuncionario = new JPanel();
        painelBotoes = new JPanel();
        painelGeral = new JPanel();

        painelGeral.setLayout(new GridLayout(4, 2));
        painelAluno.setLayout(new GridLayout(3, 2));
        painelPrincipal.setLayout(new BorderLayout());
        painelBotoes.setLayout(new GridLayout(4, 4));

        painelGeral.add(lblTipo);
        painelGeral.add(cmbTipo);
        painelGeral.add(lblNome);
        painelGeral.add(txtNome);
        painelGeral.add(lblEmail);
        painelGeral.add(txtEmail);
        painelGeral.add(lblCelular);
        painelGeral.add(txtCelular);

        painelAluno.add(lblRa);
        painelAluno.add(txtRa);
        painelAluno.add(lblCurso);
        painelAluno.add(cmbCurso);
        painelAluno.add(lblHabilitado);
        painelAluno.add(ccbHabilitado);

        painelFuncionario.add(lblCpf);
        painelFuncionario.add(txtCpf);
        painelFuncionario.add(lblEndereco);
        painelFuncionario.add(txtEndereco);
        painelFuncionario.add(lblNumero);
        painelFuncionario.add(txtNumero);
        painelFuncionario.add(lblComplemento);
        painelFuncionario.add(txtComplemento);

        painelAluno.setVisible(true);
        painelFuncionario.setVisible(true);

        painelPrincipal.add(painelGeral, BorderLayout.NORTH);

        this.setContentPane(painelPrincipal);
        this.setSize(400, 200);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        MembrosView mv = new MembrosView();

    }

    // se o tipo funcionario for ativado, mostra o painelFuncionario logo abaixo
    // do painel Geral
    // o mesmo pra aluno
    // tentativas que eu fiz mas não deram certo
    @Override
    public void actionPerformed(ActionEvent e) {
        if (cmbTipo.getSelectedIndex() == 1) {
            painelPrincipal.setSize(400, 600);

            painelPrincipal.repaint();
            painelAluno.repaint();
            painelPrincipal.add(painelAluno, BorderLayout.SOUTH);
        }

        cmbTipo.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    // int i = (int)
                    // e.getItemSelectable().getSelectedObjects()[0];
                    int i = cmbTipo.getSelectedIndex();
                    if (i == 1) {
                        painelPrincipal.setSize(400, 600);
                        painelPrincipal.add(painelAluno, BorderLayout.SOUTH);
                        painelPrincipal.repaint();
                    }
                }
            }
        });

    }
}

1 个答案:

答案 0 :(得分:0)

ActionListener,您正在致电

painelPrincipal.repaint();
在添加新面板painelAluno之前

。这应该在添加面板重新验证后发生:

painelPrincipal.add(painelAluno, BorderLayout.SOUTH);
painelPrincipal.revalidate();
painelPrincipal.repaint();

除此之外,painelPrincipal.setSize(...)对您使用布局管理器没有任何影响。上面的代码就足够了。