在jpanel中动态添加jcheckbox

时间:2017-02-10 14:38:22

标签: java swing actionlistener

当用户在表单中写入内容时,我必须在面板中动态添加jcheckbox。那是我的代码

主要

public class EmptyFrame extends JFrame{
    private static final long serialVersionUID = 1L;

    /*top panels*/
    //to add technicians
    private JButton newTechnician;
    private NewTechForm ntForm;
    private JPanel panelForm;
    private JPanel panelChekBoxes;
    TechCheckBoxGroup techniciansGroup;
    private List<String> technicians;
    //main container
    private Container pane = getContentPane();
    //components
    GroupLayout gl = new GroupLayout(pane);

    EmptyFrame(){
        preinit();
        init();
    }
    private void preinit(){
        panelChekBoxes=new JPanel();
        panelForm=new JPanel();
        techniciansGroup=new TechCheckBoxGroup(panelChekBoxes);
    }
    private void init(){
        /*top options*/
        ntForm=new NewTechForm(panelForm);            
        newTechnician=new JButton("Add technician");
        newTechnician.addActionListener(
                      new AddTechnicianAction(techniciansGroup,ntForm)
                      );
        ntForm.getPanel().add(newTechnician);
        /*end top options*/

        for(String technic : technicians){
            techniciansGroup.addCheckBoxes(
                                 new JCheckBox(technic));       
        }
        createWindowLayout(
                new JLabel("Technicians"),
                techniciansGroup.getCheckBoxes(),
                ntForm.getPanel());
    }
    public void createWindowLayout(JComponent... arg) {

        pane = getContentPane();
        gl = new GroupLayout(pane);
        pane.setLayout(gl);        
        gl.setAutoCreateContainerGaps(true);
        gl.setAutoCreateGaps(true);
        gl.setHorizontalGroup(gl.createParallelGroup()
                .addGroup(gl.createSequentialGroup()
                        .addComponent(arg[0])
                        .addComponent(arg[1])
                        .addComponent(arg[2])
                        )
        );
        gl.setVerticalGroup(gl.createSequentialGroup()
                .addComponent(arg[0])
                .addGroup(gl.createParallelGroup()
                    .addComponent(arg[0])
                    .addComponent(arg[1])
                    .addComponent(arg[2]))
            );
        pack();
    }
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
                EmptyFrame ex = new EmptyFrame();
                ex.setVisible(true);
        });
    }
}

主要是提供表格和复选框组,第一个是ntForm,第二个是技术人员组。当我在表单中插入一个名称时,我想在复选框组中添加一个复选框,这里是按钮,复选框组和表单类:

AddTechnicianAction

这将是一切都会发生的课程

public class AddTechnicianAction implements ActionListener{

    TechCheckBoxGroup technicians;
    NewTechForm form;
    JTable table;

    public AddTechnicianAction(TechCheckBoxGroup arg0, NewTechForm arg1){
        technicians=arg0;
        form=arg1;
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        System.out.println("Add new tech: "+this.form.getSurnameText().getText()+" "+this.form.getNameText().getText());
        technicians.addCheckBoxes(new JCheckBox(this.form.getSurnameText()+" "+this.form.getNameText()));
        System.out.println(technicians);
    }

}

NewTechForm

这是表格

public class NewTechForm {

    private JLabel  nameLabel;
    private JLabel  surnameLabel;
    private JTextField nameText;
    private JTextField surnameText;
    private JPanel panel;

    public NewTechForm(JPanel panel){
        nameLabel= new JLabel("Nome: ", JLabel.RIGHT);
        surnameLabel = new JLabel("Cognome:  ", JLabel.CENTER);
        nameText = new JTextField(6);
        surnameText = new JTextField(6);
        this.panel=panel;
        panel.add(nameLabel);
        panel.add(nameText);
        panel.add(surnameLabel);
        panel.add(surnameText);

    }

    public JLabel getNameLabel() {
        return nameLabel;
    }

    public JTextField getNameText() {
        return nameText;
    }

    public JTextField getSurnameText() {
        return surnameText;
    }

    public JLabel getSurnameLabel() {
        return surnameLabel;
    }

    public JPanel getPanel() {
        return panel;
    }

}

问题是TechCheckBoxGroup内部发生了什么,但不是我期待的事情。执行操作后面板有一个新的复选框,但似乎该面板(TachCheckBoxGroup中的obne)不是主类中的那个,并且实际上没有在窗口中呈现任何内容。很明显,我对摇摆中的范围不了解,有什么比我想做的更好的做法?或者这是好方法,我想念一些东西?

1 个答案:

答案 0 :(得分:0)

我认为在堆栈溢出时得到答案很重要,因此我将问题的答案发布到我的问题上,即使它不是很容易看出这是正确的解决方案,现在我解释得更好。当我试图解决错误行为的问题时,我已经问过我自己是否做了错误的考虑因素,所以就是这样,因为我试图让所有组件通信而没有真正的< / p>

  

介体

实际上,用上面编写的代码在主窗口中捕获事件是不可能的。搜索和搜索我终于找到了这个很棒的答案here。所以我基本上改变了NewTechForm类,使其成为一个带有表单内部的jpanel,对于CheckGroupBox也是如此,我将它变成一个带有复选框的面板,然后我将所有事件发送到主窗口中的一个监听器