JTable Spalte sortieren mit lauter JComboboxen ?

Status
Nicht offen für weitere Antworten.
F

FR33K

Gast
Hallo,

Was ich vorhabe:

Ich möchte in meiner Swing JTable in Spalte X in jeder Zeile eine JComboBox darstellen. In jeder dieser JTable befinden sich erstmal nur Daten vom Typ String.class. Wenn ich nun oben an dem Spaltenheader die spalte sortieren lasse, geht das dann überhaupt, da ja in jeder zeile diese JComboboxen drin wären... oder blickt der sortieralgo das und nimmt den String in der JCombobox ???
 
F

FR33K

Gast
MIr ist noch was eingefallen, wie kann ich z.B. meine jtable nach den werten in der z.B. 1. spalte sortieren und danach werden die werte in der 2. spalte sortiert. Das ganze sollte man festlegen können, bevor die Tabelle überhaupt geladen wird sprich der user bekommt nur eine fertig sortiert TAbelle zu Gesicht, geht das denn?
 
B

Beni

Gast
Wenn die JComboBoxen nur vom TableCellRenderer/Editor dargestellt werden, aber im TableModel tatsächlich Strings sind, wird das keine Probleme bereiten. Der Sortier-Algo geht nach dem TableModel, nicht nach der Darstellung.

Wenn du allerdings graphische Komponenten im TableModel speicherst... nunja, dann machst du sowieso was falsch.

Für das Problem zweier Spalten: ich denke das sollte ungefähr so funktionieren (habe den Code aber nicht ausprobiert):
Code:
List<RowSorter.SortKey> order = new ArrayList<RowSorter.SortKey>();
order.add( new RowSorter.SortKey( 0, SortOrder.ASCENDING ));
order.add( new RowSorter.SortKey( 1, SortOrder.ASCENDING ));

RowSorter<? extends TableModel> sorter = table.getRowSorter();
sorter.setSortKeys( order );
 
F

FR33K

Gast
Danke dir ich test es später zuvor habe ich noch ein anderes Problem:
Code:
tabelle.setDefaultRenderer(Object.class, new ComboCellRenderer());
        tabelle.setDefaultEditor(Object.class, new ComboCellEditor());

in meiner Tabelle habe ich boolean.class, String.class usw. Nun möchte ich genau der 3. spalte sagen, dass nur dort die JComboboxen dargestellt werden sollen. Denn im MOment werden fast alle spalten mit der JCombobox gefüllt.

z.B. sowas müsste es geben: tabelle.setDefaultEditor(3,Object.class, new ComboCellEditor());

Ist eine JCombobox nun von der class Object oder String? Ich will nur Strings in der JCB darstellen, noch nicht mal abfragen!
 
B

Beni

Gast
Du kannst die JTable nach dem "TableColumnModel" fragen, und dieses TableColumnModel dann nach der 3. Column. Du erhälst dann eine "TableColumn", und kannst dieser TableColumn direkt Renderer & Editor setzen.

Code:
TableColumnModel columns = table.getColumnModel();
TableColumn column = columns.getColumn( 2 );
column.setXYZ( xyz );

Das funktioniert aber nur nachdem du das TableModel gesetzt hast. Und wenn die Columns durch irgendein Ereignis neu erzeugt werden, gehen alle Einstellungen verloren.

Alternativ kannst du auch einfach eine zusätzliche Klasse für diese "setDefaultXYZ"-Methoden benutzen:
Code:
table.setDefaultRenderer( NutzloseAberMarkierendeKlasse.class, ... );
 
F

FR33K

Gast
1. super klappt, nur ist meine besagte Spalte mit den JComboboxen jetzt vom Typ String.class oder Object.class, beide geht?

2. Warum kann ich den hinzugefügten Text meiner JCB erst lesen wenn ich drauf klicke? Wie kann ich das beheben, das der ausgwählte Text sofort angezeigt wird?
 
B

Beni

Gast
1. Die Angabe der Klasse für eine Column, dient nur dazu den passenden Renderer/Editor/Comparator/... für die Column zu finden. Du kannst da eine beliebige Klasse verwenden, es geht nur darum, dass überall konsistent dieselbe Klasse verwendet wird (natürlich wäre es schön, wenn die angegebene Klasse und der Typ der angezeigten Objekte übereinstimmt... aber es geht auch anders).

2. Wenn sich Daten ändern, muss das immer über das TableModel geschehen. Das TableModel muss allen registrierten TableModelListenern sagen, dass sich eine Zelle/Spalte/... verändert hat. Die JTable wird dieses "Event" bemerken, und sich selbst neu zeichnen.
Die JComboBoxen sind lediglich Bilder, sie dürfen sich nicht "von sich aus" verändern.
 
F

FR33K

Gast
1. Die Angabe der Klasse für eine Column, dient nur dazu den passenden Renderer/Editor/Comparator/... für die Column zu finden. Du kannst da eine beliebige Klasse verwenden, es geht nur darum, dass überall konsistent dieselbe Klasse verwendet wird (natürlich wäre es schön, wenn die angegebene Klasse und der Typ der angezeigten Objekte übereinstimmt... aber es geht auch anders).

du bist mir einer ;-) jetzt verwirrst mich aber. Sollte ich nun für meine Spalte mit den JComboBoxen eine String.class oder eine Object.class nehmen? WEnn ja mit welcher Begründung (sonst verstehe ich doch nichts)

2. Wenn sich Daten ändern, muss das immer über das TableModel geschehen. Das TableModel muss allen registrierten TableModelListenern sagen, dass sich eine Zelle/Spalte/... verändert hat. Die JTable wird dieses "Event" bemerken, und sich selbst neu zeichnen.
Die JComboBoxen sind lediglich Bilder, sie dürfen sich nicht "von sich aus" verändern.

Bei mir haben sich keine Daten geändert noch glaube ich du weißt wovon ich rede ;-) Wenn die Tabelle gelade wird, wird auch in Spalte X in jeder zeile eine JCB dargestellt mit verschiedenen Strings mehr passiert nicht. Doch diese Strings befinden sich in dem rechteckigen dropdown auswahlfeld. Erst wenn ich auf die JCBox klick und ein String auswähle, dann wird dieser in dem oberen Feld dargestellt.

Muss ich dann künstlich herbeiführen, dass das TableModel den TableModelListernen (den habe ich aber nicht implementiert extra) sagt hey sagt der JTable, sie soll sich neuzeichnen ???
 
B

Beni

Gast
FR33K hat gesagt.:
1. Die Angabe der Klasse für eine Column, dient nur dazu den passenden Renderer/Editor/Comparator/... für die Column zu finden. Du kannst da eine beliebige Klasse verwenden, es geht nur darum, dass überall konsistent dieselbe Klasse verwendet wird (natürlich wäre es schön, wenn die angegebene Klasse und der Typ der angezeigten Objekte übereinstimmt... aber es geht auch anders).

du bist mir einer ;-) jetzt verwirrst mich aber. Sollte ich nun für meine Spalte mit den JComboBoxen eine String.class oder eine Object.class nehmen? WEnn ja mit welcher Begründung (sonst verstehe ich doch nichts)

"Es ist egal, du kannst eine beliebige Klasse wählen". Begründung: die Class-Objekte werden als Schlüssel benutzt um in irgendwelchen Maps die Renderer/Editoren/etc. zu finden, welche in einer Spalte arbeiten sollen. Es ist egal, welchen Schlüssel du anwendest, solange du konsistent überall denselben anwendest. Du könntest sogar was anderes als "Object" oder "String" nehmen. Nur denk daran, dass Spalten mit demselben Schlüssel auch gleich dargestellt werden.


2. Wenn sich Daten ändern, muss das immer über das TableModel geschehen. Das TableModel muss allen registrierten TableModelListenern sagen, dass sich eine Zelle/Spalte/... verändert hat. Die JTable wird dieses "Event" bemerken, und sich selbst neu zeichnen.
Die JComboBoxen sind lediglich Bilder, sie dürfen sich nicht "von sich aus" verändern.

Bei mir haben sich keine Daten geändert noch glaube ich du weißt wovon ich rede ;-) Wenn die Tabelle gelade wird, wird auch in Spalte X in jeder zeile eine JCB dargestellt mit verschiedenen Strings mehr passiert nicht. Doch diese Strings befinden sich in dem rechteckigen dropdown auswahlfeld. Erst wenn ich auf die JCBox klick und ein String auswähle, dann wird dieser in dem oberen Feld dargestellt.

Muss ich dann künstlich herbeiführen, dass das TableModel den TableModelListernen (den habe ich aber nicht implementiert extra) sagt hey sagt der JTable, sie soll sich neuzeichnen ???
Ok, ich verstehe nicht was du meinst :bae: Vielleicht ein kleines Beispiel (das man direkt laufen lassen kann)?
Jedenfalls: den TableModelListener must du nicht implementieren, du musst ihn höchstens aufrufen (falls du das TableModel selbst geschrieben hast).
 

wallie

Mitglied
schau mal da:

arw0xzckjhesof81n.jpg


das oberste JCombobox zeigt ein Element an, weil ich es ausgewählt habe.

alle anderen JComboboxen zeigen nichts an, da ich es noch nicht ausgewählt habe. Weiter unten siehst du ja, dass 3 Elemente in der liste sind. Das ausgewählte wird dann auch dargestellt, nur wie sage ich der JCBox, dass sie alle Elemente mit dem index=0 darstellen in der obersten Zeile, ohne dass ich/user dies extra auswählen muss wenn die Anwendung startet?
 
B

Beni

Gast
Wie sieht denn dieser ComboBox-Renderer aus? Wie setzt du da das Element das selektiert ist?

Etwa so? Oder stell ich mir das komplet falsch vor?
Code:
public class ComboBoxRenderer extends JComboBox implements TableCellRenderer{

  public Component getTableCellRendererComponent(
    JTable table, Object value, boolean isSelected, 
    boolean hasFocus, int row, int column) {

    setSelectedItem( value );
    return this;
  }
}
 

wallie

Mitglied
ComboCellRenderer.class
Code:
public class ComboCellRenderer implements TableCellRenderer {

        public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            combo.setSelectedItem(value);
            return combo;
        }

        private JComboBox combo = new JComboBox(new String[] {"a", "b", "c"});
    }


ComboCellEditor.class
Code:
public class ComboCellEditor extends AbstractCellEditor implements TableCellEditor {

        public Object getCellEditorValue () {
            return combo.getSelectedItem();
        }

        public Component getTableCellEditorComponent (JTable table, Object value, boolean isSelected, int row, int column) {
            combo.setSelectedItem(value);
            return combo;
        }

        private JComboBox combo = new JComboBox(new String[] {"a", "b", "c"});
    }
 

wallie

Mitglied
Hallo Beni,

Code aus dem Forum von Andre Uhres:

auch mit diesem Code werden die WErte nicht oben in der JCB angezeigt, erst wenn ich auf einen Wert klicke ??


Code:
class MyComboBoxEditor extends DefaultCellEditor
{
	 
    public MyComboBoxEditor(final String[] items)
    {
        super(new JComboBox(items));
    }
}

Code:
class MyComboBoxRenderer extends JComboBox implements TableCellRenderer 
    {
        
    	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

		public MyComboBoxRenderer(final String[] items)
        {
            super(items);
        }
        
    	public Component getTableCellRendererComponent(final JTable table, final Object value,
                final boolean isSelected, final boolean hasFocus, final int row, final int column)
    	{
            if (isSelected) {
                setForeground(table.getSelectionForeground());
                setBackground(table.getSelectionBackground());
            } else {
                setForeground(table.getForeground());
                setBackground(table.getBackground());
            }
            setSelectedItem(value);
            return this;
        }
    }
 

wallie

Mitglied
Code:
setSelectedItem(getItemAt(0));

damit gehts wobei ich feststellte, dass dies vorbelegung eh schwachsinn ist, da der user sich das item in der JCB selber auswählen soll... danke dir dennoch Beni!

Warum finde ich keinen Haken um den Thread als "ok" zu setzen?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T JTable - Einzelne Spalte nicht sortieren? AWT, Swing, JavaFX & SWT 2
L JTable (DefaultTableModel) nach Spalte sortieren-TableSorter AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
J JTable filtern nach einer Spalte AWT, Swing, JavaFX & SWT 2
G JTable als fixierte Spalte in Scrollpane scrollt nicht mit... AWT, Swing, JavaFX & SWT 1
Bartertown JTable - Verschiedene Komponenten in einer Spalte unterbringen AWT, Swing, JavaFX & SWT 3
S Swing JTable zusätzliche Spalte mit einer Checkbox einfügen AWT, Swing, JavaFX & SWT 7
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
S JTable Spalte "normale" Breite? AWT, Swing, JavaFX & SWT 5
F JTable soll mit Buttons befüllt werden, aber nicht in jede Zelle einer Spalte AWT, Swing, JavaFX & SWT 3
GianaSisters Swing ComboBox im jTable (in bestimmter Zelle nicht über die ganze Spalte) AWT, Swing, JavaFX & SWT 4
N Swing JTable: Objekttyp einer Spalte nachträglich ändern AWT, Swing, JavaFX & SWT 6
A Swing Spalte in JTable ausblenden AWT, Swing, JavaFX & SWT 4
T JTable mit Renderer sortiert die gerenderte Spalte nicht richtig AWT, Swing, JavaFX & SWT 2
E Spalte in JTable löschen AWT, Swing, JavaFX & SWT 4
B JTable, Spalte nicht verschiebbar AWT, Swing, JavaFX & SWT 2
R JTable immer nur die letzte Spalte markiert.... AWT, Swing, JavaFX & SWT 4
S Swing JTable: in erster Spalte Image darstellen AWT, Swing, JavaFX & SWT 30
V JTable: Sortierung einer Spalte zum Programmstart? AWT, Swing, JavaFX & SWT 3
G JTable warten bis Spalte verschoben wurde AWT, Swing, JavaFX & SWT 2
R JTable: Zellen einer Spalte unterschiedlich befüllen AWT, Swing, JavaFX & SWT 2
G JTable in Spalte von anderer JTable nicht editierbar AWT, Swing, JavaFX & SWT 7
G Alle Werte einer Spalte in JTable zusammenrechnen AWT, Swing, JavaFX & SWT 2
J in JTable ganze Spalte editierbar machen AWT, Swing, JavaFX & SWT 17
J JTable ganze Spalte sperren AWT, Swing, JavaFX & SWT 6
C Spalte aus JTable löschen AWT, Swing, JavaFX & SWT 8
mabe83 Kontinuierlich verbleibende Zeit in JTable Spalte anzeigen AWT, Swing, JavaFX & SWT 2
P JTable:Sortierung nach der Zeit/Spalte mit Calendar-Objekten AWT, Swing, JavaFX & SWT 2
D JTable 1. Spalte fixieren AWT, Swing, JavaFX & SWT 3
E JTable nur die erste Spalte auswählbar? AWT, Swing, JavaFX & SWT 4
B JTable - Wechsel der Spalte bei TAB, RETURN oder Maus AWT, Swing, JavaFX & SWT 5
S Hintergrundfarbe in einer Spalte der JTable verändern AWT, Swing, JavaFX & SWT 3
A JTable: Zeit in Spalte ausgeben AWT, Swing, JavaFX & SWT 2
S Checkbox oder String in JTable-Spalte AWT, Swing, JavaFX & SWT 4
U JTable Position der Spalte abfragen AWT, Swing, JavaFX & SWT 7
E JTable; Zeilen der ersten Spalte definieren? AWT, Swing, JavaFX & SWT 4
H JTable Text aus mehreren Zellen in einer Spalte kopieren? AWT, Swing, JavaFX & SWT 3
L Falsche Zeile gelöscht nach Spalte Sortierung in JTable AWT, Swing, JavaFX & SWT 2
S JTable Spalte hinzufügen AWT, Swing, JavaFX & SWT 3
J Spalte in JTable aus- und wieder einblenden AWT, Swing, JavaFX & SWT 10
Student JTable - eine fixe Spalte, der Rest scrollbar AWT, Swing, JavaFX & SWT 18
V JTable mit mehreren Componenten in einer Spalte ? AWT, Swing, JavaFX & SWT 6
D JTable Spalte unsichtbar machen AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben