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:
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".
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 =newJTable(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.
-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
3
Ich habe das benutzt und es hat funktioniert: Es ist sehr einfach und funktioniert gut.
Antworten:
Sie können eine verwenden
TableModel
.Definieren Sie eine Klasse wie folgt:
tatsächlich
isCellEditable()
istfalse
standardmäß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 IhresJTable
.quelle
public void
Methode kann keinen Booleschen Wert zurückgeben.isCellEditable
Sie können die Methode isCellEditable überschreiben und wie gewünscht implementieren:
oder
Beachten Sie, ob Ihre JTable verschwindet
Wenn Ihr
JTable
verschwindet, wenn Sie dies verwenden, ist es höchstwahrscheinlich, weil SieDefaultTableModel(Object[][] data, Object[] columnNames)
stattdessen den Konstruktor verwenden müssen.quelle
quelle
einfach hinzufügen
es funktioniert gut für mich.
quelle
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:
Ohne Editoren können Daten nicht bearbeitet werden.
quelle
new JTable(Vector, Vector)
und für mich gearbeitet. Ich brauche keinen Redakteur in keiner Zelle, also hast du meine Stimme.Ich habe das benutzt und es hat funktioniert: Es ist sehr einfach und funktioniert gut.
quelle
Erstellen Sie eine neue DefaultCellEditor-Klasse:
und benutze setCellEditor:
quelle