Java 管理动态添加到JScrollPane的JCheckbox
我正在研究将JCheckBox添加到面板,然后将该面板添加到JScrollPane的功能。到目前为止,我已经完成了将不同的JCheckBox动态添加到面板的工作,但是当我将同一个面板添加到JScrollPane时,它不会将JCheckBox显示到JScrollPane Q.1同样的东西没有出现在JScrollPane中的可能原因是什么 Q.2即使我将JCheckBox添加到面板,然后将该面板添加到JScrollPane,我如何管理这些选定的功能我的意思是如何将ActionListener添加到动态添加的JCheckBoxJava 管理动态添加到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添加到动
注意:我正在为面板使用绝对布局例如使用
网格布局
(一列多行)
保留复选框的数组(或列表)。查看添加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实现