Frage

Ich habe einen benutzerdefinierten TableCellRenderer (ValueRenderer) für eine JTable. Die Zelle ist ein Checkbox.

Ich habe dem valueRenderer einen ItemListener angehängt, um die Statusänderung des Kontrollkästchens (ausgewählt / abgewählt) abzuhören, wie in diesem Beispiel .

Mein Problem ist, dass ich im itemStateChanged(ItemEvent e) nicht weiß, wie ich die Zeile abrufen soll, in der dieses Kontrollkästchen enthalten ist, da ich weiß, dass die ItemEvent-Quelle der ValueRenderer ist.

Können Sie mir helfen?

Hier ist ein Teil meines Codes:

Benutzerdefinierter TableCellRender:

public class ValueRenderer extends JCheckBox implements TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
        this.setSelected((Boolean) value);
        return this;
    }

} 

ItemListener:

public class TableRowCheckBoxListener implements ItemListener {

    private JTable hqlRequestTable;

    public TableRowCheckBoxListener(JTable hqlRequestTable) {
        this.hqlRequestTable = hqlRequestTable;
    }

    @Override
    public void itemStateChanged(ItemEvent e) {

        /*How do I get the row which contains the checkbox clicked knowing that :
            e.getSource() == ValueRenderer
            e.getItem() == ValueRender
        */
    }

}

War es hilfreich?

Lösung

Wenn Sie wissen möchten, wann sich ein Wert in Ihrer Tabelle ändert, dürfen Sie keinen Listener im Renderer registrieren.Sie müssen einen Listener für das Tabellenmodell registrieren: Dort werden die von der Tabelle angezeigten Daten gespeichert, und dies ist das Objekt, das ein Ereignis auslöst, wenn sich etwas an den Daten ändert.

Die Alternative besteht darin, ein benutzerdefiniertes Tabellenmodell zu verwenden, das aus einer Liste von Beans besteht, das Tabellenmodell die Eigenschaften der darin enthaltenen Beans ändern zu lassen und die Bean ein Eigenschaftsänderungsereignis auslösen zu lassen, wenn sich eine Eigenschaft ändert.Anschließend registrieren Sie Listener für die Beans selbst, anstatt einen Listener für Tabellenmodelle zu registrieren (beachten Sie, dass das Tabellenmodell jedoch weiterhin Ereignisse für Tabellenmodelle auslösen muss).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top