0

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

对于我在 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 吗?我知道您可以通过单击读取修饰符,但不知道是否可以将它们应用于指定对象的单击。

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

4

2 回答 2

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

   }

}
于 2009-11-26T22:20:12.023 回答
0

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

然后,您可以将 MouseListener 添加到表中,并在选中另一列时切换复选框的值。

于 2009-11-26T21:24:30.167 回答