Domanda

Ha fatto un ListCellRenderer personalizzato:

import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;

/**
 *
 * @author Spencer
 */
public class TaskRenderer implements ListCellRenderer {

    private Task task;

    private JPanel panel = new JPanel();
    private JCheckBox checkbox = new JCheckBox();
    private JLabel label = new JLabel();

    public TaskRenderer() {
        panel.add(checkbox);
        panel.add(label);
    }

    public Component getListCellRendererComponent(
            JList list,
            Object value,
            int index,
            boolean isSelected,
            boolean cellHasFocus) {
        task = (Task) value;
        label.setText(task.getName());
        return panel;
    }

}

Avere un JList con ogni cella in essa rese utilizzando la classe di cui sopra, ma le caselle di controllo nei pannelli per ogni cella non può essere cliccato. Pensato che avesse a che fare con esso non ottenere attenzione. Tutte le idee?

Grazie, Spencer

È stato utile?

Soluzione

Il renderer personalizzato è semplicemente che disciplinano l'aspetto dei contenuti JList, non aggiungendo alcuna funzionalità come la possibilità di modificare i componenti (casella di controllo) -. Immaginate semplicemente come un timbro di gomma utilizzato per visualizzare ogni cella lista a sua volta

mi consiglia di risolvere il problema:

  1. Usa un singola colonna JTable invece di un JList.
  2. Definire una misura di attuazione TableModel per sotto-classing AbstractTableModel e di override getColumnClass (int) per tornare Boolean.class per la colonna 0. Si noti che il renderer di default ora rende questo come un JCheckBox. Tuttavia, non sarà un JCheckBox etichettato come si richiede.
  3. Aggiungi una misura TableCellRenderer per booleani; per esempio. myTable.setCellRenderer (Boolean.class, nuova MyLabelledCheckBoxRenderer ());
  4. Aggiungi un editor per booleani, utilizzando qualcosa di simile a: myTable.setCellEditor (Boolean.class, nuova DefaultEditor (nuova JCheckBox ( "è abilitata)));

Altri suggerimenti

JIDE strato comune ha un GPL CheckBoxList . Fondamentalmente si utilizza un JPanel come renderer di celle con JCheckBox davanti ad un altro renderer (che potete impostare voi stessi), e le maniglie del mouse / eventi chiave.

Se davvero si vuole attaccare al vostro renderer JCheckBox, è possibile ascoltare mouse / eventi chiave ed elaborarli in modo appropriato. Tenete a mente che, come ha sottolineato Adamski, renderer di celle è un timbro di gomma (a battente 101) in modo da avere per impostare sempre lo stato casella di controllo selezionata nel getListCellRendererComponent(), altrimenti tutte le vostre caselle di controllo avranno la Save State.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top