【问题标题】:Nested CheckBox in Java [closed]Java中的嵌套复选框[关闭]
【发布时间】:2013-06-26 02:09:26
【问题描述】:

我想创建一个嵌套的复选框列表。如果用户选中主项,则所有子项都被选中。如果用户选中了某些子项,则主项复选框内会出现一个蓝色方块。
它应该看起来像这样

(来源:css-tricks.com
.

如何在 Java 1.6 中做到这一点?我可以使用 swing 或任何外部库吗? 我想选择最简单,最快的方法来实现这一目标?我的目标是只创建 1 层嵌套。

更新 我也想要展开和折叠功能

【问题讨论】:

  • 不知道任何库,但请使用 ButtonGroup 的想法编写自己的。

标签: java swing checkbox jcheckbox


【解决方案1】:

1) 由于您不需要展开/折叠复选框,因此您可能不需要树。只需使用首选布局在面板中的相应位置添加复选框即可。

2) 建立一个复选框模型以具有适当的父子关系。

3) 将 actionListener 添加到您的复选框,并监听选中/取消选中事件。选中父节点时,选中所有子节点,反之亦然。

示例代码

        import java.awt.BorderLayout;
        import java.awt.Dimension;

        import java.awt.Toolkit;

        import java.awt.event.WindowAdapter;

        import java.awt.event.WindowEvent;

        import javax.swing.JFrame;
        import javax.swing.UIManager;


        public class NewJPanel extends javax.swing.JPanel {

            /** Creates new form NewJPanel */
            public NewJPanel() {
                initComponents();
            }


            @SuppressWarnings("unchecked")
            private void initComponents() {
                jCheckBox1 = new javax.swing.JCheckBox();
                jCheckBox2 = new javax.swing.JCheckBox();
                jCheckBox3 = new javax.swing.JCheckBox();

                jCheckBox1.setText("Tall Things");
                jCheckBox1.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        jCheckBox1ActionPerformed(evt);
                    }
                });

                jCheckBox2.setText("Buildings");

                jCheckBox3.setText("Giants");

                javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
                this.setLayout(layout);
                layout.setHorizontalGroup(
                    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jCheckBox1)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jCheckBox2)
                            .addComponent(jCheckBox3))
                        .addContainerGap(321, Short.MAX_VALUE))
                );
                layout.setVerticalGroup(
                    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jCheckBox1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jCheckBox2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jCheckBox3)
                        .addGap(0, 232, Short.MAX_VALUE))
                );
            }

            private void jCheckBox1ActionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBox2.setSelected(jCheckBox1.isSelected());
                jCheckBox3.setSelected(jCheckBox1.isSelected());
            }


            private javax.swing.JCheckBox jCheckBox1;
            private javax.swing.JCheckBox jCheckBox2;
            private javax.swing.JCheckBox jCheckBox3;
            public static void main(String[] args) {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

                    JFrame frame = new JFrame();
                    frame.setSize(new Dimension(400,200));
                    frame.getContentPane().setLayout(new BorderLayout());
                    frame.getContentPane().add(new NewJPanel());
                    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                    Dimension frameSize = frame.getSize();
                    if (frameSize.height > screenSize.height) {
                        frameSize.height = screenSize.height;
                    }
                    if (frameSize.width > screenSize.width) {
                        frameSize.width = screenSize.width;
                    }
                    frame.setLocation( ( screenSize.width - frameSize.width ) / 2, ( screenSize.height - frameSize.height ) / 2 );
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

【讨论】:

    【解决方案2】:

    我会使用 JTree,并使用 复选框 渲染节点。扩展收缩的逻辑应该由节点监听器处理

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      相关资源
      最近更新 更多