代码之家  ›  专栏  ›  技术社区  ›  Relequestual

包含jcheckbox和字符串的jlist,使用非ctrl单击选择?

  •  0
  • Relequestual  · 技术社区  · 15 年前

    自从我在这里贴了一段时间,现在我发现自己又一次陷入困境。

    对于我在uni的任务,我们被要求创建一个地址簿应用程序。它进展顺利,几乎完成了,但是项目的一部分,这纯粹是我的偏好,我无法理解。我不会在任务的任何部分寻求帮助,这会给我加分,只是说清楚。如果有人愿意的话,我可以上传规范。(/披露)

    应用程序的一部分是从自定义文件类型和vCard格式导入和导出。这个很好用。自定义文件类型包含多个联系人,每个联系人只有4行。因为它包含多个联系人,所以会打开一个新窗口,要求用户选择要导出到文件中的联系人。这包含一个jlist,用户可以在其中选择联系人并导出文件,没有问题。

    我一直在尝试创建一个自定义单元渲染器,允许在jlist中使用复选框。我看这儿差点儿把它弄好了( http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer 在这里( http://www.jroller.com/santhosh/entry/jlist_with_checkboxes 但是没有运气。第一个链接解释了如何创建自定义单元渲染器,而不是复选框,第二个链接解释了如何创建复选框。我可以让复选框显示,不过,这就是所有显示的内容。

    在后一个示例中,必须单击框本身才能选择列表的成员。我想做的是允许用户单击列表项或复选框来选择项。

    在我使用的Just复选框版本中,选择有效,但要选择多个项目,仍然必须按住Ctrl键。是否有任何方法可以使其成为多个项目选择不需要ctrl?我知道您可以在单击时读取修饰符,但不知道是否可以将它们应用于指定对象的单击。

    欢迎您的想法、评论、建议、链接和准确答案!:)

    2 回复  |  直到 15 年前
        1
  •  1
  •   Carl Smotricz    15 年前

    这样做,有点;虽然它本质上是伪造的,因为复选框实际上不做任何事情,但是选中它们确实会选择列表项。

    import java.awt.Component;
    import java.awt.FlowLayout;
    
    import javax.swing.BoxLayout;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.ListCellRenderer;
    
    
    public class Relequestual extends JFrame {
    
       private final FunkyCellRendererComponent funkyCRC = new FunkyCellRendererComponent();
    
       public Relequestual() {
          getContentPane().setLayout(new FlowLayout());
    
          String[] items = { "Item 1", "Item 2", "Item 3", "Item 4" };
          JList theList = new JList(items);
          theList.setCellRenderer(
          new ListCellRenderer() {
             @Override
             public Component getListCellRendererComponent(JList list, Object value, int index,
                   boolean isSelected, boolean cellHasFocus) {
                funkyCRC.setup(list, value, index, isSelected, cellHasFocus);
                return funkyCRC;
             }
          });
          getContentPane().add(theList);
    
       }
    
       /**
        * @param args
        */
       public static void main(String[] args) {
          Relequestual gui = new Relequestual();
          gui.pack();
          gui.setVisible(true);
       }
    
       class FunkyCellRendererComponent extends JPanel {
    
          private JCheckBox checkBox = new JCheckBox();
          private JLabel label = new JLabel();
          private JList list;
          private int index;
    
          public FunkyCellRendererComponent() {
             super(null);
             setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
             add(this.checkBox);
             add(this.label);
          }
    
          public void setup(JList list, Object value, int index,
                   boolean isSelected, boolean cellHasFocus) {
             this.list = list;
             this.index = index;
             this.label.setText((String) list.getModel().getElementAt(index)); 
             if (isSelected) {
                setForeground(list.getSelectionForeground());
                setBackground(list.getSelectionBackground());
             } else {
                setForeground(list.getForeground());
                setBackground(list.getBackground());
             }
             this.checkBox.setSelected(isSelected);
          }
    
       }
    
    }
    
        2
  •  0
  •   camickr    15 年前

    我将使用jtable并将复选框添加为单独的列。

    然后您可以向表中添加一个mouseListener,每当选中另一列时,您都会切换该复选框的值。