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

голоса
27

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

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

Задан 21/08/2008 в 13:49
источник пользователем
На других языках...                            


9 ответов

голоса
21

Замечательный ответ таков 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я столкнулся с некоторыми проблемами ( модели поведения , которые не работали). Я изменю этот ответ , если я нахожу проблемы с CheckBoxListI связаны с.

Ответил 27/12/2009 в 16:07
источник пользователем

голоса
16

Создание пользовательских ListCellRendererи Asign его к JList.

Этот обычай ListCellRendererдолжен возвращать JCheckboxв implementantion из getListCellRendererComponent(...)метода.

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

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

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

ListCellRenderer

Ответил 21/08/2008 в 14:05
источник пользователем

голоса
10

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

Ответил 21/08/2008 в 14:04
источник пользователем

голоса
8

Просто реализовать 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

Подробности на Настраиваемый качаться компонентов рендеры .

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

Ответил 30/11/2014 в 17:16
источник пользователем

голоса
5

Лучше решение для 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"));
Ответил 16/07/2014 в 10:53
источник пользователем

голоса
3

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

Мой проект имел большой успех с Jide. Компонент вы хотите, список флажка, в Jide общего слое (который ОСС и размещено на java.net). Коммерческий материал тоже хорошо, но вам это не нужно.

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

Ответил 21/08/2008 в 14:18
источник пользователем

голоса
2

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

Ответил 14/09/2013 в 16:56
источник пользователем

голоса
0

Все агрегатных компонентов Swing - то есть, компоненты составляют другие компоненты, такие как JTable, JTree или JComboBox - могут быть весьма настроены. Например, компонент JTable обычно отображает сетку из компонентов JLabel, но она также может отображать JButtons, текстовых полей JTextField, или даже другие объекты JTable. Получение этих агрегированных компонентов для отображения не по умолчанию объектов легкой часть, однако. Делая их должным образом реагировать на события клавиатуры и мышей гораздо более сложная задача, из-за разделения Свинга компонентов в «рендеры» и «редактор». Это разделение было (на мой взгляд) плохой выбор дизайна и служит только мудрить при попытке расширить компоненты 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. Чтобы использовать класс, просто создать его экземпляр, а затем передать его массив объектов JCheckBox (или подклассов объектов JCheckBox) по телефону setListData. Обратите внимание, что галочки в этом компоненте не будет реагировать на нажатия клавиш (т.е. ПРОБЕЛ), но вы всегда можете добавить свой собственный ключ слушателя, если это необходимо.

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

Ответил 22/09/2015 в 08:26
источник пользователем

голоса
0

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

        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();
                }
            }
        }
        });
Ответил 27/08/2014 в 08:13
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more