2013-06-28 78 views
1

我想创建一个嵌套的复选框列表。如果用户检查主项目,则检查所有子项目并进行检查。如果用户检查了一些子项目,则在主项目复选框内出现蓝色方块。
它应该看起来像这样
thisJava中的嵌套复选框

我该如何在Java 1.6中做到这一点?我可以使用秋千或任何外部图书馆吗? 我想选择最简单和最快的方式来实现这一目标?我的目标是创建只有1层嵌套。

UPDATE 我想有展开和折叠功能,以及

+0

不知道这方面的任何LIB,而是采取ButtonGroup的想法写自己。 – PeterMmm

回答

2

我会用一个JTree的,并与复选框渲染节点。扩展合同的逻辑应由节点监听者处理

0

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