So machen Sie eine JTable nicht bearbeitbar


Antworten:


22

Sie können eine verwenden TableModel.

Definieren Sie eine Klasse wie folgt:

public class MyModel extends AbstractTableModel{
    //not necessary
}

tatsächlich isCellEditable()ist falsestandardmäßig , so dass Sie es weglassen kann. (Siehe: http://docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html )

Dann verwenden Sie die setModel()Methode Ihres JTable.

JTable myTable = new JTable();
myTable.setModel(new MyModel());

1
Eine public voidMethode kann keinen Booleschen Wert zurückgeben.
Geo

1
Auch die Methode istisCellEditable
Matt

Während der von Ihnen angegebene Ansatz funktioniert, gibt es im AbstractTableModel keine Methode wie isEditable. Was existiert, ist die Methode isCellEditable (int, int), die rowIndex und coulmnIndex als Parameter verwendet. Der Benutzer kann die Bearbeitung für eine bestimmte Zeile / Spalte selektiv aktivieren / deaktivieren, indem er die Methode "isCellEditable" überschreibt, oder die Standardimplementierung verwenden, um die Bearbeitung für alle Zellen zu deaktivieren.
Sateesh

150

Sie können die Methode isCellEditable überschreiben und wie gewünscht implementieren:

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

oder

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

   @Override
   public boolean isCellEditable(int row, int column) {
       //Only the third column
       return column == 3;
   }
};

table.setModel(tableModel);

Beachten Sie, ob Ihre JTable verschwindet

Wenn Ihr JTableverschwindet, wenn Sie dies verwenden, ist es höchstwahrscheinlich, weil Sie DefaultTableModel(Object[][] data, Object[] columnNames)stattdessen den Konstruktor verwenden müssen.

//instance table model
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames) {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

3
Dies ist auch die Lösung, damit Doppelklickereignisse mit JTable ordnungsgemäß funktionieren. Ein Doppelklick wird normalerweise von einer Zelle verbraucht, wenn sie in den Bearbeitungsmodus wechselt. Dies verhindert, dass eine Zelle dies tut, und sendet stattdessen den Doppelklick an die JTable selbst. Danke für die Lösung, Nelson!
Anchorite

2
@Jop dann stimmt etwas an anderer Stelle in Ihrem Code nicht - eine Tabelle verschwindet nie , nur weil das Modell der Tabelle nicht bearbeitet werden kann ...
kleopatra

1
@DougHauf Es scheint, dass Sie kein Java oder wirklich eine Sprache kennen, die so gut ist, da die meisten Sprachen die gleiche Syntax für boolesche Operationen verwenden ... die einen booleschen Wert zurückgibt ... Ich würde Ihnen empfehlen, ein sehr einfaches Java zu suchen Tutorial und von vorne beginnen. Wenn Sie versuchen, so in Schwung zu kommen, werden Sie am Ende alles falsch lernen.
Searchengine27

1
@DougHauf, == ist ein Alias ​​für die Equals-Funktion, die die Objekte (links und rechts) vergleicht und einen Booleschen Wert zurückgibt. Ich nehme an, Sie haben die Anweisung verwendet, wenn diese Boolesche Werte auswertet und normalerweise mit dieser Art von Ausdrücken verwendet wird, zum Beispiel wenn (a == b) etwas tut. Versuchen Sie, a == b zu drucken, oder weisen Sie dies einfach einer Variablen zu und verstehen Sie das Ergebnis.
Nelson Eldoro

1
Das obige Update funktioniert auch bei mir nicht. Dadurch werden die Spalten- und Datenelemente der Tabelle ausgeblendet. Meine Tabelle wird mit table = new JTable (tempTable, columnNames); erstellt, wobei tempTable ein String [] [] und Column Names ein String [] ist. Ich glaube, das Problem wird durch das neue DefaultTableModel () verursacht, das die Daten- und Spaltennamen für das Tabellenmodell nicht angibt. Wie spezifiziere ich diese im Datenmodell? Ich habe table.setModel (tableModel (tempTable, columnNames)) ausprobiert. Dies führt jedoch zu dem Fehler "Symbol kann nicht gefunden werden".
user1164199

49
table.setDefaultEditor(Object.class, null);

2
Dies ist die beste und einfachste Antwort. Natürlich müssen Sie den Editor auf null setzen, damit Sie ihn nicht bearbeiten können.
LEMUEL ADANE

Dies funktioniert hervorragend mit Einzelauswahl. Was war meine Anforderung.
Wesos de Queso

Dies sollte die ANTWORT sein!
KrishPrabakar

36

einfach hinzufügen

table.setEnabled(false);

es funktioniert gut für mich.


1
Dies ist großartig, wenn Sie kein benutzerdefiniertes Tischmodell verwenden!
Kingsolmn

26
Sie können jedoch keine Zelle oder Zeile auswählen.
Tianz

3
Dies wird in einigen L & Fs "ausgegraut" aussehen.
Stommestack

2
Das funktioniert. Vielen Dank. Ich möchte jedoch immer noch wissen, warum die Datenmodellmethode von Nelson dazu führt, dass die Spalten- und Datenelemente der Tabelle verschwinden.
user1164199

1
Funktioniert gut für mich!
Colby Cox

10

Wenn Sie das TableModel automatisch aus einer Reihe von Werten erstellen (mit "new JTable (Vector, Vector)"), ist es möglicherweise einfacher, Editoren aus Spalten zu entfernen:

JTable table = new JTable(my_rows, my_header);

for (int c = 0; c < table.getColumnCount(); c++)
{
    Class<?> col_class = table.getColumnClass(c);
    table.setDefaultEditor(col_class, null);        // remove editor
}

Ohne Editoren können Daten nicht bearbeitet werden.


4
-1 zufälliges Hacken an unangemessenen Orten ist nie eine Option
Kleopatra

Können Sie bitte erklären, warum es sich um ein "zufälliges Hacken an unangemessenen Orten" handelt? Laut dem Dokument setDefaultEditor () : "Wenn der Editor null ist, wird der Standardeditor für diese Spaltenklasse entfernt."
Freesoft

Ja, und fällt auf die Standardeinstellung für Objekt zurück ;-) Sie deaktivieren die Bearbeitung also nicht wirklich (nur aus Versehen, wenn eine der Spalten vom Typ Objekt ist), und es fehlen auch Spalten, die möglicherweise einen benutzerdefinierten Editor haben. Es gibt eine API, die implementiert werden soll, um die Bearbeitbarkeit von Zellen zu steuern, und das ist das Modell. Alles andere ist Hacking und als solches unangemessen.
Kleopatra

Ich weiß, worauf du hinauswillst. Aber was ich aus der API verstanden habe, ist, dass, wenn ich eine Tabelle auf schnelle Weise erstelle (mit "neuer JTable (Vector, Vector)"), die Tabelle Standardeditoren für alle ihre Spalten hat. Wenn ich also "table.setDefaultEditor (column, null)" ausführe, entferne ich den Standardeditor aus der Spalte, sodass die Spalte keinen Editor hat und die Spalte nicht bearbeitet werden kann. Wird es sein?
Freesoft

Ich hatte den Tisch so erstellt new JTable(Vector, Vector)und für mich gearbeitet. Ich brauche keinen Redakteur in keiner Zelle, also hast du meine Stimme.
Dani Sancas


2

Erstellen Sie eine neue DefaultCellEditor-Klasse:

public static class Editor_name extends DefaultCellEditor {
  public Editor_name(JCheckBox checkBox) {
   super(checkBox);
  }
  @Override
  public boolean isCellEditable(EventObject anEvent) {
    return false;
  }
}

und benutze setCellEditor:

JTable table = new JTable();
table.getColumn("columnName").setCellEditor(new Editor_name(new JCheckBox()));
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.