Java 管理动态添加到JScrollPane的JCheckbox

Java 管理动态添加到JScrollPane的JCheckbox,java,swing,jscrollpane,jcheckbox,null-layout-manager,Java,Swing,Jscrollpane,Jcheckbox,Null Layout Manager,我正在研究将JCheckBox添加到面板,然后将该面板添加到JScrollPane的功能。到目前为止,我已经完成了将不同的JCheckBox动态添加到面板的工作,但是当我将同一个面板添加到JScrollPane时,它不会将JCheckBox显示到JScrollPane Q.1同样的东西没有出现在JScrollPane中的可能原因是什么 Q.2即使我将JCheckBox添加到面板,然后将该面板添加到JScrollPane,我如何管理这些选定的功能我的意思是如何将ActionListener添加到动

我正在研究将JCheckBox添加到面板,然后将该面板添加到JScrollPane的功能。到目前为止,我已经完成了将不同的JCheckBox动态添加到面板的工作,但是当我将同一个面板添加到JScrollPane时,它不会将JCheckBox显示到JScrollPane

Q.1同样的东西没有出现在JScrollPane中的可能原因是什么

Q.2即使我将JCheckBox添加到面板,然后将该面板添加到JScrollPane,我如何管理这些选定的功能我的意思是如何将ActionListener添加到动态添加的JCheckBox


注意:我正在为面板使用绝对布局

例如使用
网格布局
(一列多行)

保留复选框的数组(或列表)。查看添加
ActionListener
的列表,或者您可以获取主面板的子组件,迭代它们,并将其转换为
JCheckBox
,然后添加侦听器


最糟糕的方法是使用
绝对布局定义面板的首选尺寸,例如
网格布局(1列多行)

保留复选框的数组(或列表)。查看添加
ActionListener
的列表,或者您可以获取主面板的子组件,迭代它们,并将其转换为
JCheckBox
,然后添加侦听器


最糟糕的方法是使用
绝对布局定义面板的首选尺寸,例如
网格布局(1列多行)

保留复选框的数组(或列表)。查看添加
ActionListener
的列表,或者您可以获取主面板的子组件,迭代它们,并将其转换为
JCheckBox
,然后添加侦听器


最糟糕的方法是使用
绝对布局定义面板的首选尺寸,例如
网格布局(1列多行)

保留复选框的数组(或列表)。查看添加
ActionListener
的列表,或者您可以获取主面板的子组件,迭代它们,并将其转换为
JCheckBox
,然后添加侦听器


最糟糕的方法是使用
AbsoluteLayout

定义面板的首选尺寸。AbsoluteLayout不是一个好的解决方案,但如果使用固定尺寸,它应该可以工作。 添加复选框后,是否在面板对象上调用重新验证

对于Q2,您可以将添加的复选框存储在向量或HashMap中(取决于所涉及的逻辑),然后您可以创建实现上述接口的自定义ActionListener。 更重要的是,您可以将面板的引用传递给自定义ActionListener,并在其actionPerformed中使用该引用调用存储复选框向量的面板上的方法

下面是我所说内容的快速示例:

package pkg;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

class AddCheckBoxAction implements ActionListener{
    CheckBoxPanel panel;
    public AddCheckBoxAction(CheckBoxPanel panel){
        this.panel = panel;
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        panel.addNewCheckBox();

    }

}

class CheckBoxAction implements ActionListener{
    private int id;
    CheckBoxAction(int id){
        this.id = id;
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        System.out.println("CheckBox "+this.id+" was clicked");

    }
}

class CheckBoxPanel extends JPanel{
    private JButton addCheckBox = new JButton("Add CheckBox");
    private Vector<JCheckBox> checkBoxes = new Vector<JCheckBox>();
    public CheckBoxPanel(){
        addCheckBox.addActionListener(new AddCheckBoxAction( this ) );
        add(addCheckBox);
    }
    public void addNewCheckBox() {
        JCheckBox chBox = new JCheckBox("CheckBox "+( this.checkBoxes.size()+1 ));
        chBox.addActionListener(new CheckBoxAction(this.checkBoxes.size()+1));
        this.checkBoxes.add(chBox);
        add(chBox);
        this.revalidate();



    }
}
public class DynamicCheckBoxTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        CheckBoxPanel chD = new CheckBoxPanel();
        JFrame mainFrame = new JFrame();
        JScrollPane scrollP = new JScrollPane( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS );
        scrollP.setViewportView(chD);
        mainFrame.setSize(320,200);
        mainFrame.getContentPane().add(scrollP);
        mainFrame.setVisible(true);

    }

}
package-pkg;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.Vector;
导入javax.swing.JButton;
导入javax.swing.JCheckBox;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
类AddCheckBoxAction实现ActionListener{
检查箱面板;
public AddCheckBoxAction(CheckBoxPanel面板){
this.panel=面板;
}
@凌驾
已执行的公共无效操作(操作事件arg0){
panel.addNewCheckBox();
}
}
类CheckBoxAction实现ActionListener{
私有int-id;
CheckBoxAction(内部id){
this.id=id;
}
@凌驾
已执行的公共无效操作(操作事件arg0){
System.out.println(“选中复选框“+此.id+”);
}
}
类CheckBoxPanel扩展了JPanel{
私有JButton addCheckBox=新JButton(“添加复选框”);
私有向量复选框=新向量();
公共复选框面板(){
addCheckBox.addActionListener(新的AddCheckBoxAction(this));
添加(添加复选框);
}
public void addNewCheckBox(){
JCheckBox chBox=newjcheckbox(“CheckBox”+(this.CheckBox.size()+1));
addActionListener(新的CheckBoxAction(this.checkBoxes.size()+1));
此。复选框。添加(chBox);
添加(chBox);
这个。重新验证();
}
}
公共类动态checkboxtest{
/**
*@param args
*/
公共静态void main(字符串[]args){
CheckBoxPanel chD=新的CheckBoxPanel();
JFrame mainFrame=新JFrame();
JScrollPane scrollP=新的JScrollPane(JScrollPane.VERTICAL\u SCROLLBAR\u ALWAYS,JScrollPane.HORIZONTAL\u SCROLLBAR\u ALWAYS);
scrollP.setViewportView(chD);
大型机。设置大小(320200);
mainFrame.getContentPane().add(scrollP);
mainFrame.setVisible(true);
}
}

绝对布局不是一个好的解决方案,但在固定大小的情况下,它应该可以工作。 添加复选框后,是否在面板对象上调用重新验证

对于Q2,您可以将添加的复选框存储在向量或HashMap中(取决于所涉及的逻辑),然后您可以创建实现上述接口的自定义ActionListener。 更重要的是,您可以将面板的引用传递给自定义ActionListener,并在其actionPerformed中使用该引用调用存储复选框向量的面板上的方法

下面是我所说内容的快速示例:

package pkg;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

class AddCheckBoxAction implements ActionListener{
    CheckBoxPanel panel;
    public AddCheckBoxAction(CheckBoxPanel panel){
        this.panel = panel;
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        panel.addNewCheckBox();

    }

}

class CheckBoxAction implements ActionListener{
    private int id;
    CheckBoxAction(int id){
        this.id = id;
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        System.out.println("CheckBox "+this.id+" was clicked");

    }
}

class CheckBoxPanel extends JPanel{
    private JButton addCheckBox = new JButton("Add CheckBox");
    private Vector<JCheckBox> checkBoxes = new Vector<JCheckBox>();
    public CheckBoxPanel(){
        addCheckBox.addActionListener(new AddCheckBoxAction( this ) );
        add(addCheckBox);
    }
    public void addNewCheckBox() {
        JCheckBox chBox = new JCheckBox("CheckBox "+( this.checkBoxes.size()+1 ));
        chBox.addActionListener(new CheckBoxAction(this.checkBoxes.size()+1));
        this.checkBoxes.add(chBox);
        add(chBox);
        this.revalidate();



    }
}
public class DynamicCheckBoxTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        CheckBoxPanel chD = new CheckBoxPanel();
        JFrame mainFrame = new JFrame();
        JScrollPane scrollP = new JScrollPane( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS );
        scrollP.setViewportView(chD);
        mainFrame.setSize(320,200);
        mainFrame.getContentPane().add(scrollP);
        mainFrame.setVisible(true);

    }

}
package-pkg;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.Vector;
导入javax.swing.JButton;
导入javax.swing.JCheckBox;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
类AddCheckBoxAction实现ActionListener{
检查箱面板;
public AddCheckBoxAction(CheckBoxPanel面板){
this.panel=面板;
}
@凌驾
已执行的公共无效操作(操作事件arg0){
panel.addNewCheckBox();
}
}
类CheckBoxAction实现