包含JCheckBox和String的JList,非ctrl点击选择?

时间:2009-11-26 20:48:38

标签: java selection jlist jcheckbox modifiers

自从我在这里发布以来已经有一段时间了,现在我发现自己又陷入了困境。

对于我在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),我几乎得到了这个工作,但是没有运气。第一个链接说明了如何创建自定义单元格渲染器,但没有解释复选框,第二个链接说明了如何创建复选框。我可以显示复选框,然后显示所有内容。

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

在我工作的复选框的版本中,选择工作,但是仍然必须按住ctrl才能选择多个项目。有没有办法让它更多选择项目不需要ctrl?我知道您可以通过单击读取修改器,但不知道是否可以将它们应用于单击指定对象。

您的想法,意见,建议,链接和确切答案都非常欢迎! :)

2 个答案:

答案 0 :(得分:1)

这样做,有点;虽然它基本上是伪造的,因为复选框并没有真正做任何事情,但检查它们确实选择了列表项。

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

   }

}

答案 1 :(得分:0)

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

然后,您可以向表中添加MouseListener,每当选中其他列时,您都可以切换复选框的值。