管理动态添加的JCheckBox到JScrollPane

时间:2013-10-17 13:02:48

标签: java swing jscrollpane jcheckbox null-layout-manager

我正在研究将JCheckBox添加到Panel然后将该Panel添加到JScrollPane的功能。到目前为止,我已经完成了向Panel添加不同的JCheckBox但是当我将相同的Panel添加到JScrollPane时,它没有向JScrollPane显示JCheckBoxes

Q.1 在JScrollPane中出现相同内容的可能原因可能是什么?

Q.2 即使我将JCheckBox添加到Panel然后将该Panel添加到JScrollPane我如何管理setSelected功能我的意思是我如何将ActionListener添加到动态添加的JCheckBox?

注意:我正在使用面板的AbsoluteLayout

3 个答案:

答案 0 :(得分:2)

例如使用GridLayout(1列和多行)。

保留复选框的数组(或列表)。浏览添加ActionListener的列表,或者您可以获取主面板的子组件,遍历它们以转换为JCheckBox并添加侦听器。

最糟糕的方法是使用AbsoluteLayout为面板定义首选大小。

答案 1 :(得分:1)

AbsoluteLayout不是一个好的解决方案,但固定大小应该有效。 添加复选框后,您是否在面板对象上调用了revalidate?

对于Q2,您可以在Vector或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);

    }

}

答案 2 :(得分:0)

AbsoluteLayout不是一个健康的选择, 相反,您可以使用-容器

我能够解决您的问题。 下面是代码,请参考

Container contentPane = getContentPane();
contentPane = getContentPane();
JPanel panel = new JPanel();
List<String> configList = new ArrayList<>();

for( int i = 0; i < configList.size(); i++ )
{
   String configValues = configList.get( i );
   JCheckBox value = new JCheckBox( configValues );
   panel.add( value );
}

JScrollPane scrollPane = new JScrollPane( panel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER );
scrollPane.setPreferredSize( new Dimension( *SIZE*, *SIZE*) );
add( scrollPane );
contentPane.add( scrollPane, BorderLayout.CENTER );