Jak zrobić listę z pól wyboru w Java Swing?

głosy
27

Jaki byłby najlepszy sposób mieć listę elementów z pole wyboru każdego w Java Swing?

Czyli JList z elementów, które mają pewien tekst i wyboru każdego?

Utwórz 21/08/2008 o 13:49
źródło użytkownik
W innych językach...                            


9 odpowiedzi

głosy
21

Wspaniałe jest to odpowiedź CheckBoxList. Implementuje odpowiedź Telkontar za (choć 3 lata wcześniej:) ... Używam go w Java 1.6 bez żadnych problemów. Dodałem także addCheckboxmetoda tak (na pewno mógłby być krótszy, nie była używana Java na jakiś czas):

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

Starałem się demo do rzeczy Jidesoft, grając z CheckBoxListI napotkał pewne problemy (zachowań, które nie działają). Będę modyfikować tę odpowiedź, jeśli znajdę problemy z CheckBoxListI powiązany.

Odpowiedział 27/12/2009 o 16:07
źródło użytkownik

głosy
16

Utworzyć niestandardowy ListCellRendereri asign to do JList.

Zwyczaj ten ListCellRenderermusi zwrócić JCheckboxw implementantion z getListCellRendererComponent(...)metody.

Ale to JCheckboxnie będzie można edytować, jest prostym farby na ekranie jest do ciebie, aby wybrać, kiedy to JCheckboxmusi być „zaznaczone”, czy nie,

Na przykład, pokazać to zaznaczone, gdy wiersz jest wybrany (parametr isSelected), ale w ten sposób status check nie będzie być utrzymane w przypadku zmiany wyboru. Jej lepiej pokazać go sprawdzane konsultacji dane poniżej ListModel, ale potem to do ciebie należy wdrożyć metodę, która zmienia status wyboru danych i powiadamia przesiąść się do JListbyć przemalowany.

Ja po przykładowy kod później, jeśli jest to potrzebne

ListCellRenderer

Odpowiedział 21/08/2008 o 14:05
źródło użytkownik

głosy
10

Ja prawdopodobnie chce użyć JTable raczej niż JList a ponieważ domyślnym rendering wyboru jest raczej brzydki, bym prawdopodobnie chce spaść w zwyczaju TableModel , CellRenderer i cellEditor reprezentuje wartość logiczną. Oczywiście, byłoby wyobrazić to zostało zrobione do bajillion razy już. Słońce ma dobre przykłady .

Odpowiedział 21/08/2008 o 14:04
źródło użytkownik

głosy
8

Wystarczy zaimplementować 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;
    }
}

i ustawić renderer

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

spowoduje to

przykładem CheckboxListCellRenderer

Szczegóły na Niestandardowy huśtawka renderujące elementów .

PS: Jeśli chcesz po prostu wymienić elementy radiowe extends JCheckboxz extends JRadioButton.

Odpowiedział 30/11/2014 o 17:16
źródło użytkownik

głosy
5

Lepszym rozwiązaniem dla Java 7 i nowsze

Natknąłem się na to pytanie i zrozumiał, że niektóre odpowiedzi są dość stare i nieaktualne. Obecnie JList ma charakter ogólny, a zatem istnieją lepsze rozwiązania.

Moje rozwiązanie generycznego 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;
    }
  }
}

Dynamicznie dodając JCheckBox wymienia trzeba utworzyć własną ListModel lub dodać DefaultListModel.

DefaultListModel<JCheckBox> model = new DefaultListModel<JCheckBox>();
JCheckBoxList checkBoxList = new JCheckBoxList(model);

W DefaultListModel są ogólne, a zatem można korzystać z metod określonych przez Java 7 API tutaj tak:

model.addElement(new JCheckBox("Checkbox1"));
model.addElement(new JCheckBox("Checkbox2"));
model.addElement(new JCheckBox("Checkbox3"));
Odpowiedział 16/07/2014 o 10:53
źródło użytkownik

głosy
3

Kursy są dobre w / Java, że ​​ktoś już wdrożone widżet lub narzędzia potrzebne. Część z zalet dużej społeczności OSS. Nie trzeba wyważać otwartych drzwi, chyba że naprawdę chcesz to zrobić samemu. W tym przypadku byłoby to dobre ćwiczenie w CellRenderers nauki i redaktorów.

Mój projekt odniósł wspaniały sukces Jide. Komponent chcesz, listę kontrolną Box, jest w Jide Wspólnej Layer (czyli OSS i utrzymywana na java.net). Rzeczy handlowa jest zbyt dobry, ale nie jest to potrzebne.

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

Odpowiedział 21/08/2008 o 14:18
źródło użytkownik

głosy
2

Polecam użyć JPanel z GridLayout 1 kolumny. Dodać pola wyboru do JPanel i ustawić JPanel jako źródło danych o JScrollPane. I dostać zaznaczone pola wyboru, wystarczy zadzwonić do getComponents () na JPanel aby uzyskać wyboru.

Odpowiedział 14/09/2013 o 16:56
źródło użytkownik

głosy
0

Wszystkie kruszywa komponentów Swing - czyli elementy składają się inne składniki, takie jak JTable, JTree lub JComboBox - może zostać dostosowany. Na przykład, składnik JTable normalnie wyświetla siatkę elementów JLabel, ale może również wyświetlać JButtons, JTextFields lub nawet inne JTables. Uzyskanie tych zagregowanych komponenty do wyświetlania niestandardowych obiektów jest łatwe, jednak. Czyniąc je prawidłowo reagować na klawiaturę i mysz zdarzeń jest o wiele trudniejsze zadanie, ze względu na separację Swing za komponentów w „renderujących” i „redaktorów”. To rozdzielenie było (moim zdaniem) złym wyborem projektu i służy jedynie skomplikować sprawy, gdy próbuje rozszerzyć komponentów Swing.

Aby zobaczyć, co mam na myśli, spróbuj składnik poprawiający JList huśtawka, tak, że wyświetla wyboru zamiast nalepek. Według filozofii Swing, to zadanie wymaga wykonania dwóch interfejsów: ListCellRenderer (na rysunku pola wyboru) i cellEditor (do obsługi klawiatury i myszy wydarzeń pola wyboru). Implementacja interfejsu ListCellRenderer jest dość prosta, ale interfejs cellEditor może być raczej niezgrabne i trudne do zrozumienia. W tym konkretnym przypadku, proponuję zapominając cellEditor całkowicie i do obsługi zdarzeń wejściowych bezpośrednio, jak pokazano w poniższym kodzie.

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

Tutaj ja przechwycić kliknięć myszy z pola listy i zasymulować kliknięcie na odpowiednim wyboru. Wynikiem jest „CheckBoxList” składnik, który jest jednocześnie prostszy i mniejszy niż równoważnej składnika przy użyciu interfejsu cellEditor. Aby korzystać z tej klasy, po prostu instancję, a następnie przekazywania ich szereg obiektów JCheckBox (lub podklasy obiektów JCheckBox), wywołując setListData. Należy pamiętać, że pola wyboru w tego składnika nie będzie reagować na naciskanie klawiszy (tj Spacja), ale zawsze można dodać swój własny klucz słuchacza w razie potrzeby.

Źródło: DevX.com

Odpowiedział 22/09/2015 o 08:26
źródło użytkownik

głosy
0

Oto trochę dodatek do JCheckBoxList przez Rawy. To doda możliwość wyboru za pomocą spacji. Jeśli wybrano wiele elementów, wszystko zostanie ustawione na odwróconym wartości pierwszego elementu.

        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();
                }
            }
        }
        });
Odpowiedział 27/08/2014 o 08:13
źródło użytkownik

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