JList, содержащий JCheckBox и строку, с выбором без нажатия Ctrl - PullRequest
0 голосов
/ 26 ноября 2009

Прошло некоторое время с тех пор, как я написал здесь, и теперь я нахожусь в точке, где я снова застрял.

Для моего задания в университете нас попросили создать приложение для адресной книги. Это идет хорошо, и это почти закончено, однако одна часть проекта, которая является исключительно моим предпочтением, ускользает от меня. Я не прошу помощи по любой части задания, которая принесет мне оценки, просто чтобы прояснить ситуацию. Я могу загрузить спецификацию, если кому-то понадобятся доказательства этого. (/ Раскрытие)

Часть приложения импортирует и экспортирует файлы пользовательского типа и формата 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 ]

1 голос
/ 27 ноября 2009

Это делает, вроде; хотя по сути это фальшивка, потому что чекбоксы на самом деле ничего не делают, но проверка их действительно выбирает элемент списка.

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

   }

}
0 голосов
/ 27 ноября 2009

Я бы использовал JTable и добавил бы флажок в виде отдельного столбца.

Затем вы можете добавить MouseListener в таблицу, и всякий раз, когда проверяется другой столбец, вы переключаете значение флажка.

...