Как сделать список с флажками в Java Swing?
каков был бы лучший способ иметь список элементов с флажком каждый в Java Swing?
т. е. JList с элементами, которые имеют некоторый текст и флажок каждый?
9 ответов
создать пользовательское ListCellRenderer
и asign его к JList
.
этот обычай ListCellRenderer
должен возвратить JCheckbox
в implementantion из getListCellRendererComponent(...)
метод.
но это JCheckbox
не будет редактироваться, это простая краска на экране до вас, чтобы выбрать, когда это JCheckbox
должно быть "галочкой" или нет,
например, показывать галочку при выборе строки (параметр isSelected
), но этот путь состояние проверки не будет mantained если выбор изменения. Его лучше показать, что он проверил консультации с данными ниже ListModel
, но тогда до вас, чтобы реализовать метод, который изменяет статус проверки данных, и уведомить об изменении JList
перекрасится.
я опубликую образец кода позже, если вам это нужно
замечательный ответ 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 для представления логического значения. Конечно, я бы предположил, что это было сделано уже миллион раз. Солнце примеры.
просто реализовать 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());
в результате
подробности на пользовательские компоненты качели визуализации.
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<JCheckBox> {
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<JCheckBox> model){
this();
setModel(model);
}
protected class CellRenderer implements ListCellRenderer<JCheckBox> {
public Component getListCellRendererComponent(
JList<? extends JCheckBox> 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<JCheckBox> model = new DefaultListModel<JCheckBox>();
JCheckBoxList checkBoxList = new JCheckBoxList(model);
на DefaultListModel общие и таким образом, вы можете использовать методы, указанные JAVA 7 API здесь такой:
model.addElement(new JCheckBox("Checkbox1"));
model.addElement(new JCheckBox("Checkbox2"));
model.addElement(new JCheckBox("Checkbox3"));
шансы хороши w / Java, что кто-то уже реализовал виджет или утилиту, которая вам нужна. Часть преимуществ большого сообщества OSS. Нет необходимости изобретать колесо, если вы действительно не хотите сделать это сами. В этом случае это было бы хорошим обучающим упражнением в CellRenderers и редакторах.
мой проект имел большой успех с JIDE. Компонент, который вы хотите, список флажков, находится в общем слое JIDE (который является OSS и размещен на java.net). Коммерческий материал хорош. тоже, но тебе это не нужно.
http://www.jidesoft.com/products/oss.htm https://jide-oss.dev.java.net/
Я рекомендую вам использовать JPanel с GridLayout 1 столбца. Добавьте флажки в JPanel и установите JPanel в качестве источника данных JScrollPane. И чтобы получить выбранные флажки, просто вызовите getComponents () JPanel, чтобы получить флажки.
вот только небольшое дополнение к списку 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();
}
}
}
});
все агрегатные компоненты в качании--то есть, компоненты составили другие компоненты, как JTable, JTree, или JComboBox--можно сильно подгонять. Например, компонент JTable обычно отображает сетку компонентов JLabel, но он также может отображать JButtons, JTextFields или даже другие JTables. Однако получение этих компонентов aggregate для отображения объектов, не являющихся объектами по умолчанию, является простой частью. Заставить их правильно реагировать на события клавиатуры и мыши-гораздо более сложная задача из-за свинга разделение компонентов на "визуализаторы" и "редакторы"."Это разделение было (на мой взгляд) плохим выбором дизайна и только усложняет дело при попытке расширить компоненты Swing.
чтобы увидеть, что я имею в виду, попробуйте улучшить компонент Jlist Swing, чтобы он отображал флажки вместо меток. Согласно философии 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. Чтобы использовать класс, просто создайте его экземпляр, а затем передайте ему массив объектов JCheckBox (или подклассы объектов JCheckBox), вызвав setListData. Обратите внимание, что флажки в этом компоненте не будут реагировать на нажатия клавиш (т. е. пробел), но при необходимости вы всегда можете добавить свой собственный прослушиватель ключей.
источник:DevX.com