2017-08-08 1 views
0

Ich weiß, dass eine Tabellenzelle in einer JTable automatisch eine Checkbox erhält, wenn Sie ihre Klasse auf Boolean setzen.Ist es möglich, JCheckBoxes in JTable-Zellen zu setzen, die KEINE booleans enthalten?

Allerdings habe ich eine Spalte in meiner JTable, die ganzzahlige Werte enthält. Ist es möglich, Ankreuzfelder zu jenen (nicht boolean) Zellen wie in meiner armen Zeichnung hinzufügen hier:

https://i.stack.imgur.com/AfJ5x.png

Mein Ziel ist es nicht, diese Spalten für wahr/falsch Werte zu überprüfen, sondern die entsprechende Auswahl Tabellenzeilen und machen Sie etwas mit ihnen. Ich weiß, dass ich stattdessen mehrere Auswahlintervalle in meinem ListSelectionModel verwenden könnte, aber ich würde es viel attraktiver mit Checkboxen finden.

+3

Warum nicht, können Sie eine weitere Boolesche Spalte erstellen und benennen es 'selection' das Kontrollkästchen Logik zu halten? – StanislavL

Antwort

3

Ja. Aggregieren Sie die numerischen und booleschen Attribute in einem einzigen Value und geben Sie einen geeigneten renderer and editor. Ihre Implementierung von getColumnClass() würde dann Value.class für die relevante Spalte zurückgeben. Ein vollständiges Beispiel, das Double verwendet, ist here, untersucht here und unten veranschaulicht. Kurz umrissen

class Value implements Comparable<Value> { 

    private Boolean selected; 
    private Integer value; 

    public Value(Boolean selected, Double value) { 
     this.selected = selected; 
     this.value = value; 
    } 
    … 
} 

class ValueRenderer extends JCheckBox 
    implements TableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent(
     JTable table, Object value, boolean isSelected, 
     boolean hasFocus, int row, int col) { 
     Value v = (Value) value; 
     this.setSelected(v.selected); 
     this.setText(df.format(v.value)); 
     … 
     return this; 
    } 
} 

class ValueEditor extends AbstractCellEditor implements TableCellEditor, ItemListener { 

    private ValueRenderer vr = new ValueRenderer(); 

    public ValueEditor() { 
     vr.addItemListener(this); 
    } 

    @Override 
    public Object getCellEditorValue() { 
     return vr.isSelected(); 
    } 
    … 
} 
… 
table.setDefaultRenderer(Value.class, new ValueRenderer()); 
table.setDefaultEditor(Value.class, new ValueEditor()); 

image

+0

Wenn ich das mache, bekomme ich eine ClassCastException, weil ich nicht von String zu Value konvertieren kann ... Ich habe versucht, den Wert innerhalb der Value-Klasse in String zu ändern, aber ich kann trotzdem nicht so casten. Wie also könnte ich dasselbe mit Strings anstelle von Double oder Integer erreichen? – Phreneticus

+0

Überprüfen Sie, ob Ihr 'TableModel' tatsächlich Instanzen von' Value' enthält und eine Implementierung von 'getColumnClass()' hat, die 'Value.class' zurückgibt. – trashgod

+0

Ich habe nur vergessen, meine getValueAt Methode zu ändern, jetzt funktioniert es, vielen Dank! – Phreneticus

-1

Warum nicht einfach eine neue Klasse erstellen, die sowohl eine Beschriftung als auch ein Kontrollkästchen enthält und diese zu Ihrer Tabelle hinzufügen?

import java.awt.*; 

import javax.swing.*; 

public class LabelWithCheckBox extends JPanel{ 

public LabelWithCheckBox(String text){ 
    setLayout(new GridBagLayout()); 
    JLabel jLabel = new JLabel(text); 
    JCheckBox checkBox = new JCheckBox(); 

    add(jLabel, new GridBagConstraints(
      0, 0, 1, 1, 1.0, 1.0, 
      GridBagConstraints.WEST, GridBagConstraints.NONE, 
      new Insets(0, 0, 0, 0), 
      0, 0 
    )); 

    add(checkBox, new GridBagConstraints(
      1, 0, 1, 1, 1.0, 1.0, 
      GridBagConstraints.WEST, GridBagConstraints.NONE, 
      new Insets(0, 0, 0, 0), 
      0, 0 
    )); 
} 

public static void main(String args[]){ 
    JFrame frame = new JFrame(); 
    frame.add(new LabelWithCheckBox("Label text")); 
    frame.setVisible(true); 
    frame.setSize(100, 50); 
} 
} 
+0

(1-), so funktioniert eine JTable nicht. Eine JTable verwendet Renderer, um die Daten anzuzeigen. – camickr

+0

@camickr Ja, vielleicht hätte ich es deutlicher machen sollen, dass Sie es über einen Renderer hinzufügen würden und nicht einfach davon ausgehen, dass das OP wissen würde, wie. – Mackattack

+1

Ein Renderer wird nicht helfen, weil er nur die Daten malt. Es ist keine echte Komponente. Sie können nicht auf das Kontrollkästchen "klicken". – camickr

Verwandte Themen