Как создать список с флажками в Java Swing?

Какой был бы лучший способ иметь список элементов с флажком в Java Swing?

Т.е. JList с элементами, которые имеют некоторый текст и флажок?

Создайте собственный ListCellRenderer и назначьте его в JList .

Этот пользовательский ListCellRenderer должен возвратить JCheckbox в реализации метода getListCellRendererComponent(...) .

Но этот JCheckbox не будет доступен для редактирования, простая краска на экране зависит от вас, чтобы выбрать, когда этот JCheckbox должен быть «отмечен» или нет,

Например, покажите, что это отмечено, когда выбрана строка (параметр isSelected ), но таким образом статус проверки не будет сохранен, если выбор изменится. Лучше показать, что он проверял консалтинг данных под ListModel , но затем вам предстоит реализовать метод, который изменяет статус проверки данных и уведомляет об изменении JList для перекраски.

Я отправлю пример кода позже, если вам это нужно

ListCellRenderer

Замечательный ответ – это CheckBoxList . Он реализует ответ Telcontar (хотя 3 года назад:) … Я использую его в Java 1.6 без проблем. Я также добавил метод addCheckbox подобный этому (конечно, может быть короче, не использовал Java в то время):

 public void addCheckbox(JCheckBox checkBox) { ListModel currentList = this.getModel(); JCheckBox[] newList = new JCheckBox[currentList.getSize() + 1]; for (int i = 0; i < currentList.getSize(); i++) { newList[i] = (JCheckBox) currentList.getElementAt(i); } newList[newList.length - 1] = checkBox; setListData(newList); } 

Я попробовал демонстрацию для материала Jidesoft, играя с CheckBoxList Я столкнулся с некоторыми проблемами (поведение, которое не сработало). Я изменю этот ответ, если найду проблемы с CheckBoxList с которыми я связан.

Вероятно, я бы хотел использовать JTable, а не JList, и поскольку рендеринг по умолчанию флажка довольно уродливый, я бы, вероятно, хотел бы добавить в пользовательский TableModel , CellRenderer и CellEditor для представления булевского значения. Конечно, я бы предположил, что это уже было сделано уже несколько раз. У Sun есть хорошие примеры .

Просто реализуйте ListCellRenderer

 public class CheckboxListCellRenderer extends JCheckBox implements ListCellRenderer { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { setComponentOrientation(list.getComponentOrientation()); setFont(list.getFont()); setBackground(list.getBackground()); setForeground(list.getForeground()); setSelected(isSelected); setEnabled(list.isEnabled()); setText(value == null ? "" : value.toString()); return this; } } 

и установите средство визуализации

 JList list = new JList(); list.setCellRenderer(new CheckboxListCellRenderer()); 

это приведет к

Пример checkboxListCellRenderer

Подробные сведения о визуализаторах компонентов Custom swing .

PS: Если вы хотите, чтобы радиоэлементы просто заменяли, extends JCheckbox с extends JRadioButton .

Лучшее решение для Java 7 и новее

Я наткнулся на этот вопрос и понял, что некоторые ответы довольно старые и устаревшие. В настоящее время JList является общим и, следовательно, есть лучшие решения.

Мое решение общего JCheckBoxList:

 import java.awt.Component; import javax.swing.*; import javax.swing.border.*; import java.awt.event.*; @SuppressWarnings("serial") public class JCheckBoxList extends JList { protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); public JCheckBoxList() { setCellRenderer(new CellRenderer()); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { int index = locationToIndex(e.getPoint()); if (index != -1) { JCheckBox checkbox = (JCheckBox) getModel().getElementAt(index); checkbox.setSelected(!checkbox.isSelected()); repaint(); } } }); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); } public JCheckBoxList(ListModel model){ this(); setModel(model); } protected class CellRenderer implements ListCellRenderer { public Component getListCellRendererComponent( JList list, JCheckBox value, int index, boolean isSelected, boolean cellHasFocus) { JCheckBox checkbox = value; //Drawing checkbox, change the appearance here checkbox.setBackground(isSelected ? getSelectionBackground() : getBackground()); checkbox.setForeground(isSelected ? getSelectionForeground() : getForeground()); checkbox.setEnabled(isEnabled()); checkbox.setFont(getFont()); checkbox.setFocusPainted(false); checkbox.setBorderPainted(true); checkbox.setBorder(isSelected ? UIManager .getBorder("List.focusCellHighlightBorder") : noFocusBorder); return checkbox; } } } 

Для динамического добавления списков JCheckBox вам необходимо создать свой собственный ListModel или добавить DefaultListModel.

 DefaultListModel model = new DefaultListModel(); JCheckBoxList checkBoxList = new JCheckBoxList(model); 

DefaultListModel являются универсальными, поэтому вы можете использовать методы, указанные JAVA 7 API, следующим образом:

 model.addElement(new JCheckBox("Checkbox1")); model.addElement(new JCheckBox("Checkbox2")); model.addElement(new JCheckBox("Checkbox3")); 

Коэффициенты хороши с Java, что кто-то уже реализовал виджет или утилиту, в которой вы нуждаетесь. Часть преимуществ большого сообщества OSS. Не нужно изобретать велосипед, если вы действительно не хотите сделать это самостоятельно. В этом случае это было бы хорошим учебным упражнением в CellRenderers и Editors.

Мой проект имел большой успех с JIDE. Компонент, который вы хотите, список флажков, находится в общем слое JIDE (который является OSS и размещен на java.net). Коммерческий материал тоже хорош, но он вам не нужен.

http://www.jidesoft.com/products/oss.htm https://jide-oss.dev.java.net/

Я рекомендую использовать JPanel с GridLayout из 1 колонки. Добавьте checkBoxes в JPanel и установите JPanel в качестве источника данных JScrollPane. И чтобы получить выбранные CheckBoxes, просто позвоните getComponents () из JPanel, чтобы получить CheckBoxes.

Вот лишь небольшое дополнение к JCheckBoxList от Rawa. Это добавит возможность выбора с помощью пробела. Если выбрано несколько элементов, все будут установлены на инвертированное значение первого элемента.

  addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { int index = getSelectedIndex(); if (index != -1 && e.getKeyCode() == KeyEvent.VK_SPACE) { boolean newVal = !((JCheckBox) (getModel() .getElementAt(index))).isSelected(); for (int i : getSelectedIndices()) { JCheckBox checkbox = (JCheckBox) getModel() .getElementAt(i); checkbox.setSelected(newVal); repaint(); } } } }); 

Все агрегированные компоненты в Swing, то есть компоненты, составляющие другие компоненты, такие как JTable, JTree или JComboBox, могут быть настроены очень хорошо. Например, компонент JTable обычно отображает сетку компонентов JLabel, но также может отображать JButtons, JTextFields или даже другие JTables. Тем не менее, получение этих агрегатных компонентов для отображения объектов, отличных от объектов по умолчанию. Правильное реагирование на события клавиатуры и мыши – задача гораздо сложнее, поскольку Swing разделяет компоненты на «рендереры» и «редакторы». Это разделение было (на мой взгляд) плохим выбором дизайна и только усложняет дело, пытаясь расширить компоненты Swing.

Чтобы понять, что я имею в виду, попробуйте улучшить компонент Swing JList, чтобы он отображал флажки вместо меток. Согласно философии Swing, эта задача требует реализации двух интерфейсов: ListCellRenderer (для рисования флажков) и CellEditor (для обработки событий клавиатуры и мыши на флажках). Реализация интерфейса ListCellRenderer достаточно проста, но интерфейс CellEditor может быть довольно неуклюжим и трудно понять. В этом конкретном случае я бы предложил полностью забыть CellEditor и напрямую обрабатывать входные события, как показано в следующем коде.

 import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.awt.event.*; public class CheckBoxList extends JList { protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); public CheckBoxList() { setCellRenderer(new CellRenderer()); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { int index = locationToIndex(e.getPoint()); if (index != -1) { JCheckBox checkbox = (JCheckBox) getModel().getElementAt(index); checkbox.setSelected( !checkbox.isSelected()); repaint(); } } } ); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); } protected class CellRenderer implements ListCellRenderer { public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JCheckBox checkbox = (JCheckBox) value; checkbox.setBackground(isSelected ? getSelectionBackground() : getBackground()); checkbox.setForeground(isSelected ? getSelectionForeground() : getForeground()); checkbox.setEnabled(isEnabled()); checkbox.setFont(getFont()); checkbox.setFocusPainted(false); checkbox.setBorderPainted(true); checkbox.setBorder(isSelected ? UIManager.getBorder( "List.focusCellHighlightBorder") : noFocusBorder); return checkbox; } } } 

Здесь я перехватываю щелчки мыши из списка и имитирую щелчок на соответствующем флажке. Результатом является компонент «CheckBoxList», который проще и меньше, чем эквивалентный компонент, используя интерфейс CellEditor. Чтобы использовать class, просто создайте его, а затем передайте ему массив объектов JCheckBox (или подclassы объектов JCheckBox), вызвав setListData. Обратите внимание, что флажки в этом компоненте не будут реагировать на нажатия клавиш (т. Е. Пробел), но при необходимости вы всегда можете добавить свой собственный прослушиватель клавиш.

Источник: DevX.com

  • Как изменить цвет фона JTabbedPane?
  • Эффективный размер экрана с Java
  • JAR Bundler с использованием OSXAdapter, заставляющий приложение запаздывать или заканчиваться
  • Как ограничить JTextField количеством томов
  • Как я могу запустить панель задач Windows с помощью Swing?
  • Добавление JPanels от других classов к cardLayout
  • Добавьте Jbutton в каждую строку Jtable
  • Обновление ImageIcon в JTree без перекраски дерева?
  • Как изменить значок JFrame
  • Как реализовать в Java (class JTextField), чтобы разрешить вводить только цифры?
  • как добавить jscrollpane в jframe?
  • Давайте будем гением компьютера.