0

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

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

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

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

4

3 回答 3

2

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

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

最糟糕的方法是使用 为面板定义首选尺寸AbsoluteLayout

于 2013-10-17T13:21:23.157 回答
1

AbsoluteLayout 不是一个好的解决方案,但它应该可以使用固定大小。添加复选框后,您是否在面板对象上调用重新验证?

至于 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);

    }

}
于 2013-10-17T13:50:06.553 回答
0

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

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

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 );

于 2020-11-26T11:10:50.617 回答