Java JTable deaktivieren einzelne Zelle Auswahlrahmen markieren
Ich habe eine JTable mit drei Spalten in jeder Zeile, siehe Bild:
Aus irgendeinem Grund abhängig von der Spalte, die ich wähle, bekomme ich die etwas zu dunkel blauer Rand um ihn herum (V140116554) im Bild oben.
Derzeit nutze ich diese um die gesamte Zeile auszuwählen:
vTable.setRowSelectionAllowed(true);
Wie kann ich diese deaktivieren?
EDIT:
Hinzugefügt eine Klasse:
public class VisitorRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setBorder(noFocusBorder);
return this;
}
}
Und fügte hinzu:
vTable.setDefaultRenderer(String.class, new VisitorRenderer());
Aber bekomme immer noch die Grenze
InformationsquelleAutor Alosyius | 2013-09-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
TableCellRenderer
ist verantwortlich für das zeichnen des Fokus-Rechteck um das aktuell fokussierte Zelle. Sie benötigen zur Versorgung Ihrer eigenen renderer, der fähig ist, entweder das überschreiben dieser Funktion oder mit eigenem...Beispielsweise;
Diese nutzt die
DefaultTableCellRenderer
als Basis-renderer und legt die KomponenteBorder
zunoFocusBorder
definiert istDefaultTableCellRenderer
alsEmptyBorder
Werden Sie dann benötigen, um diesen renderer als Standard-renderer für den betroffenen Spalten. Check-out Wie verwenden von Tabellen für mehr details
Update mit Beispiel
Funktioniert gut für mich...
Und nur um sicher zu sein, änderte ich
setBorder(noFocusBorder);
...Von den blicken der Dinge, die Besucher der Spalte Klasse Typ wird nicht berichtet, wie
String
durch dieTableModel
...Aktualisiert mit proxy-renderer-Konzept
Weil Sie möchten, entfernen Sie die Fokus-Grenze aus jeder Zelle. Sie haben drei Möglichkeiten...
Class
Typ Sie benötigen für Ihren Tisch. Dies kann zeitaufwendig und wiederholt eine Menge von code zu erreichen, nur eine geringe Wirkung.TableCellRenderer
um die eigentliche rendering-Prozess, gilt aber einige kleinere änderungen, um das Ergebnis, zum Beispiel, entfernen Sie die Grenze......
Statt etwas zu tun wie...
Was wir auch Taten, bevor wir dies tun, anstatt...
Dies bedeutet, dass wir nutzen können, was auch immer Standard-renderer ist bereits verfügbar, ohne zu wissen, was das sein könnte, aber liefern auch unsere eigenen Anforderungen.
Funktioniert Prima für mich. Siehe updates. Ich vermute, dass der Besucher die Spalte nicht berichtet wird, wie
String.class
durch IhreTableModel
...Das war das problem, jedoch habe ich 2 Spalten, Icon.class jetzt die mittlere Spalte zeigt keine Grenze, aber die erste und die Letzte immer noch tun, weil Sie sind Icon.Class
Sie haben zu tun die gleiche Sache für jeden Typ. Eine hinterhältige Art und Weise wäre eine
ProxyCellRenderer
nahm die andereTableCellRenderer
, benutzte es, um den Mechanismus zu renderer einer bestimmten Zelle den Inhalt, stellen aber die Grenze zu einemEmptyBorder
diese Weise könnte man einfach nur die Standard-Renderer, die im Einsatz sind und füttern Sie durch diesen proxy-renderer statt...Nicht ganz sicher, ob ich Folgen :/
InformationsquelleAutor MadProgrammer
Wenn Sie haben absolut keine Notwendigkeit, die Grenze auf eine beliebige Zelle in dieser Tabelle, nur für
MyRenderer
alle Zellen, unabhängig von der Klasse. Sie können es so machen:table.setDefaultRenderer(Object.class, new MyRenderer());
InformationsquelleAutor Pranx