Index von verschobenen Spalten (JTable)

Status
Nicht offen für weitere Antworten.

Miss Evil

Mitglied
Hallo,

ich bräuchte nochmal eure Hilfe.
Ich habe ja ein Applet mit einer JTable. Ich kann die Zeilen neu sortieren, bekomme aber trotzdem über das TableModel die richtige Zeile geliefert. Wunderbar!
Allerdings kann ich im Applet mit der Maus die Spalten neu anordnen, bekomme da aber leider nur den Wert der sichtbaren Tabelle zurückgeliefert, wenn ich irgendwo drücke.

Ich habe einen Vektor mit den Spaltentypen (columnTypes) Und im Moment frage ich eben:

Code:
if(columnTypes.elementAt(column).equals(COLUMN_TYPE_NORMAL_LINK) [...]

Das klappt natürlich nur, wenn die Tabelle ihren ursprünglichen Aufbau hat, da sich der Vector mit den Typen ja nicht neu sortiert, wenn ich das Applet ändere.

Hat jemand eine Idee, wie ich dieses Problem lösen kann?

Danke
 

DTR

Bekanntes Mitglied
Du könntest versuchen die Informationen aus columnTypes direckt in die Spalten mit einzubauen. Also von TabelColumn ableiten, und ein zusätzliches Attribut mit anlegen für den Typ. Wenn du jetzt die Spalten umsortierst, werden die Informationen automatisch mit sortiert. Sie stecken ja in der Spalte mit drin.
 

mariopetr

Bekanntes Mitglied
im tablehaeder nach dem namen der spalte suchen, daraus ergibt sich der index der entsprechenden spalte.
 
G

Guest

Gast
DTR hat gesagt.:
Du könntest versuchen die Informationen aus columnTypes direckt in die Spalten mit einzubauen. Also von TabelColumn ableiten, und ein zusätzliches Attribut mit anlegen für den Typ. Wenn du jetzt die Spalten umsortierst, werden die Informationen automatisch mit sortiert. Sie stecken ja in der Spalte mit drin.

Die Idee finde ich ja schon gut, allerdings habe ich dann das Problem, dass er meine Renderer nicht mehr anspricht.
Code:
table.setDefaultRenderer(Object.class, new TableCellRenderer());
		tcm = table.getColumnModel();
		// renderer for header
		table.getTableHeader().setDefaultRenderer(new ColumnHeaderRenderer(chl, button_up, button_down));
		// searching for possible column types
		for (int i=0; i<columnTypes.size(); i++) {
			try{
				MTableColumn column = (MTableColumn)tcm.getColumn(i);
				column.setPreferredWidth(Integer.parseInt((String)columnWidths.get(i)));
				if (COLUMN_TYPE_NORMAL.equals(columnTypes.elementAt(i))){
					column.setType((String)columnTypes.elementAt(i));
				}else if(COLUMN_TYPE_NORMAL_LINK.equals(columnTypes.elementAt(i))){
					column.setType((String)columnTypes.elementAt(i));
				}else if(COLUMN_TYPE_HIGHLIGHT.equals(columnTypes.elementAt(i))) {
					column.setCellRenderer(new HighlightCellRenderer());
					column.setType((String)columnTypes.elementAt(i));

Vorher hatte ich den gleichen Code eben nur mit TableColumn und ohne setType():

Was hab ich da falsch gemacht?

Ach ja, die Klasse MTableColumn enthält zurzeit nur einen Konstruktor und die get-/set-Methoden.
Code:
public MTableColumn (int index){
		super(index);
		type = "";
	}
 

DTR

Bekanntes Mitglied
Hat es einen Grund, warum du nicht direkt an der TabelColumn die Renderer setzt?
 
G

Guest

Gast
Direkt an TableColumn? Sorry, die Frage verstehe ich jetzt nicht ganz :(
Aber das ist nur ein Ausschnitt meines Codes, ich habe danach nochmal ca. 8 mal diese If_abfrage, da ich immer unterschiedliche Renderer habe...
War das in etwa die Info, die du haben wolltest? Hier mal der komplette Block im laufenden Original.
Code:
for (int i=0; i<columnTypes.size(); i++) {
			try{
				TableColumn column = tcm.getColumn(i);
				column.setPreferredWidth(Integer.parseInt((String)columnWidths.get(i)));
				if (COLUMN_TYPE_NORMAL.equals(columnTypes.elementAt(i))){
				}else if(COLUMN_TYPE_NORMAL_LINK.equals(columnTypes.elementAt(i))){
				}else if(COLUMN_TYPE_HIGHLIGHT.equals(columnTypes.elementAt(i))) {
					column.setCellRenderer(new HighlightCellRenderer());
				} else if (COLUMN_TYPE_HIGHLIGHT_LINK.equals(columnTypes.elementAt(i))) {
					column.setCellRenderer(new HighlightCellRenderer());
				} else if (COLUMN_TYPE_NUMBER.equals(columnTypes.elementAt(i))) {
					column.setCellRenderer(new NumberCellRenderer());
				} else if (COLUMN_TYPE_NUMBER_LINK.equals(columnTypes.elementAt(i))) {
					column.setCellRenderer(new NumberCellRenderer());
				} else if (COLUMN_TYPE_NUMBER_COLOR.equals(columnTypes.elementAt(i))) {
					column.setCellRenderer(new ColoredNumberCellRenderer());
				} else if (COLUMN_TYPE_NUMBER_COLOR_LINK.equals(columnTypes.elementAt(i))) {
					column.setCellRenderer(new ColoredNumberCellRenderer());
				} else if (COLUMN_TYPE_INDICATOR_NORMAL.equals(columnTypes.elementAt(i))) {
					column.setCellRenderer(new NumberCellRenderer());
				} else if (COLUMN_TYPE_INDICATOR_NORMAL_LINK.equals(columnTypes.elementAt(i))) {
					column.setCellRenderer(new NumberCellRenderer());
				} else if (COLUMN_TYPE_INDICATOR_COLOR.equals(columnTypes.elementAt(i))) {
					column.setCellRenderer(new ColoredNumberCellRenderer());
				} else if (COLUMN_TYPE_INDICATOR_COLOR_LINK.equals(columnTypes.elementAt(i))) {
					column.setCellRenderer(new ColoredNumberCellRenderer());
				} else if (COLUMN_TYPE_ICON.equals(columnTypes.elementAt(i))) {
					column.setCellRenderer(new IconCellRenderer());
				}
			}
			catch (Exception e){
				System.out.println(e.getMessage());
			}
 

DTR

Bekanntes Mitglied
Ja, das ist das was ich haben wollte. Kannst du dann bitte nochmel dein Problem genauer beschreiben.
 
G

Guest

Gast
Mein Problem ist, dass, wenn ich die TableColumn in eine MTableColumn casten will (siehe Code 1) dann werden die Renderer und die Verlinkung nicht mehr aktiviert. Außerdem bekomme ich später auch eine ClassCastException, wenn ich beim MouseListener die Spalte haben möchte.
Code:
col = table.columnAtPoint(event.getPoint());
				column = (MTableColumn)tcm.getColumn(col);

Ich muss danach dann nämlich an das Extraattribut, welches ich hinzugefügt habe.
 
G

Guest

Gast
Code:
public class MTableColumn extends TableColumn {
	private String type;
	
	public MTableColumn (int index){
		super(index);
		type = "";
	}

	/**
	 * @return
	 */
	public String getType() {
		return type;
	}

	/**
	 * @param string
	 */
	public void setType(String string) {
		type = string;
	}
	
}

Da ist nicht viel drin, da ich das meiste an die Superklasse deligiere...
 

Miss Evil

Mitglied
Trotzdem danke für deine Hilfe :)

Ich habe jetzt auch einen anderen Weg gefunden... zwar nicht so schön, aber funktioniert... Ich habe jetzt mit modelindex gearbeitet.
 

Miss Evil

Mitglied
So, eine letzte Frage, bevor ich mit meinem Applet fertig bin *bg*

Ich habe ja meine JTable und kann diese in unefähr 18 verschiedenen Arten sortieren. Jetzt brauche ich allersings, wenn es irgendwie machbar ist, den Index der geklickten Reihe...
Ich weiß, dass ich über das DefaultTableModel die Werte bekomme, aber nicht den Index. Also im Prinzip das gleiche Problem, wie gestern, nur diesmal auf den Zeilen.

Also, die Werte bekomme ich über:
Code:
	for(int i=0; i<desiredColumnsVector.size(); i++){
					for(int j=0; j<symbolCount; j++){
						if(((Vector)dtm.getDataVector().elementAt(row)).elementAt(i).equals(symbols.elementAt(j))){
								symbol = (String)symbols.elementAt(j);
								linkCells(column, symbol);
						}
					}
				}

Aber ich bräuchte den index und dazu habe ich noch nichts gefunden. :(

Das wars dann aber auch mit meinem Applet und die nächsten Fragen drehen sich (voraussichtlich) mal um was anderes *g*

Danke
 

Miss Evil

Mitglied
Doch, aber dann habe ich nur den Wert der Reihe in der View und nicht im Model. Da ich aber wieder intern was vergleichen muss, ist die aktuelle Position in der View völlig uninteressant.
 

Miss Evil

Mitglied
weil ich die View umsortieren kann. Ich kann jede Spalte auf-/absteigend sortieren. Das macht 18 verschiedene Möglichkeiten, wo die Zeilen stehen können. Und da sich die Werte ja beim Update ja auch verändern, sind sie nie in der Zeile, wie das Model sie am Anfang eingeordnet hatte.
Über DefaultTableModel.getElementAt(index) (bzw. setElementAt) kann man auf die Zelle im Model zugreifen (siehe Codebeispiel bei der Frage) allerdings nur auf den Wert und der nützt mir nichts.
 

Miss Evil

Mitglied
Hab ich da was falsch verstanden?
Ich dachte, wenn ich durch Mausklick im Applet was ändere, ändere ich nur die View und das Model bleibt so, wie es am Anfang angelegt wurde. Ich klicke einfach auf die spaltenüberschriften, um auf-/absteigend zu sortieren....

Zitat aus Handbuch der Java Programmierung (http://www.rz.fhtw-berlin.de/hjp3/k100242.html#ixa102692)


Bei der Verwendung der Methoden getValueAt und setValueAt ist es wichtig zu wissen, daß die angegebenen Zeilen- und Spaltenwerte sich auf die aktuelle Ansicht der Tabelle beziehen, nicht auf ihr Modell. Hat der Anwender beispielsweise die Spalten eins und zwei vertauscht, würde ein Zugriff auf ein Element in Spalte eins den Modellwert in Spalte zwei verändern und umgekehrt. Während dieses Verhalten erwartungskonform ist, wenn der Wert durch den Anwender editiert wird, würde es bei programmgesteuertem Aufruf zu einem logischen Fehler kommen, denn das Programm hat natürlich zunächst einmal keine Kenntnis davon, daß der Anwender die Spaltenreihenfolge verändert hat. In aller Regel werden programmgesteuerte Zugriffe auf einzelne Zellen daher nicht mit getValueAt und setValueAt ausgeführt, sondern an die gleichnamigen Methoden des TableModel delegiert.
 

DTR

Bekanntes Mitglied
Da man durch einfaches anklicken des Headers sortieren kann, ist neu für mich. Man kann halt immer noch etwas lernen. Ich hab das auch mal kurz ausprobiert und bei mir geht das garnicht (JDK 1.3). Deshalb würde ich wenn ich die Spalten tauschen wollte das mit der Maus machen, und wenn ich die Zeilen tauschen wollte, würde ich das Modell umsortieren. Dadurch stimmen dann, zumindest was die Zeilen betrifft, Model und View überein.
Das löst aber dein Problem nicht. Ich werde nochmal überlegen, ob mir noch ein Weg einfällt dir zu helfen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
J index im Array aussuchen AWT, Swing, JavaFX & SWT 1
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
T Swing Index für Komponente in JPanel? AWT, Swing, JavaFX & SWT 6
S JList Index finden AWT, Swing, JavaFX & SWT 6
L JTableModel - Zeilen mit eigenem Index ausstatten AWT, Swing, JavaFX & SWT 4
W Swing Bei einem 2-dimensionalen array, bei mouseClicked index zuordnen AWT, Swing, JavaFX & SWT 2
M Index von Combobox AWT, Swing, JavaFX & SWT 20
L Swing JTabbedPane - Index vom Tab AWT, Swing, JavaFX & SWT 3
Iron Monkey JPopupMenu/JMenuItem Index für getSubElements()[] ermitteln AWT, Swing, JavaFX & SWT 8
V JComboBox gleicher Inhalt bedeutet gleicher Index? AWT, Swing, JavaFX & SWT 7
P JList Index Ändern Problem AWT, Swing, JavaFX & SWT 4
F An eindeutigen Index eines Tabs in einer JTabbed Pane kommen AWT, Swing, JavaFX & SWT 3
V Vector->TableModel->RowSorter:Bei Markierung Index im AWT, Swing, JavaFX & SWT 2
I JList scrollt nicht zum selektierten Index AWT, Swing, JavaFX & SWT 2
P 2 Probleme mit Panel: index setzten und transparenz AWT, Swing, JavaFX & SWT 4
D JTextFields in Vektor: index auslesen AWT, Swing, JavaFX & SWT 10
R ListSelectionListener + index? AWT, Swing, JavaFX & SWT 15
P JList: Ausgewählten Index anzeigen AWT, Swing, JavaFX & SWT 6
M jLabel per Index ansprechen? AWT, Swing, JavaFX & SWT 8
Student Drag & Drop: Index nach verschieben herausfinden AWT, Swing, JavaFX & SWT 3
sliwalker MouseEvent,JKomponente aus Array: Wie bekommt man den Index AWT, Swing, JavaFX & SWT 2
Encera TableView Zeilen als Spalten im SceneBuilder AWT, Swing, JavaFX & SWT 0
W JavaFX JavaFX - Spalten auf ganze SpreadsheetView verteilen AWT, Swing, JavaFX & SWT 16
H automatische Anzahl der Spalten ermitteln -> geht nicht AWT, Swing, JavaFX & SWT 6
ralfb1105 JavaFX Dynamisch TableView Spalten erstellen AWT, Swing, JavaFX & SWT 4
L JavaFX Gridpane mit gleich großen Spalten AWT, Swing, JavaFX & SWT 23
K TreeTableView (cellFactory) - wie Daten in Spalten einfügen AWT, Swing, JavaFX & SWT 0
H TableView mit variabler Anzahl Spalten AWT, Swing, JavaFX & SWT 2
R Swing JTable : Header der Spalten ergänzen mit caption (wie bei html-table) AWT, Swing, JavaFX & SWT 2
S JComboBox mit mehreren Spalten? AWT, Swing, JavaFX & SWT 6
D Swing Bestimmte Berechnung von Spalten durchführen und dann die Zeilen nach bestimmten Kriterien einfärben AWT, Swing, JavaFX & SWT 5
K JavaFX Spalten der Tabellen verschieben AWT, Swing, JavaFX & SWT 2
W JTable erstellen und Spalten sortieren AWT, Swing, JavaFX & SWT 2
I JTable Spalten automatisch dem Inhalt anpassen! AWT, Swing, JavaFX & SWT 6
O Swing Spalten-Position nach verschieben AWT, Swing, JavaFX & SWT 6
M JTable mit wechselnden Spalten - sehr Langsam AWT, Swing, JavaFX & SWT 5
O Swing JTable spalten sollen Links stehen AWT, Swing, JavaFX & SWT 5
T Spaltengröße einzelner Spalten in Gridlayout festlegen AWT, Swing, JavaFX & SWT 3
M Swing JTable - Umsortieren einzelner Spalten unterbinden AWT, Swing, JavaFX & SWT 6
D Problem mit 3-Spalten Layout AWT, Swing, JavaFX & SWT 17
J Swing JTable: Komplette Zeile aber ohne Spalten markieren AWT, Swing, JavaFX & SWT 11
B JFileChooser breite der Spalten? AWT, Swing, JavaFX & SWT 5
P Liste mit Icons und mehreren Spalten AWT, Swing, JavaFX & SWT 7
B JTable Zeilen und Spalten selektieren AWT, Swing, JavaFX & SWT 5
G LayoutManager Layout für Spalten AWT, Swing, JavaFX & SWT 8
I jList mit Spalten AWT, Swing, JavaFX & SWT 3
G Swing JTextArea mit fester Anzahl Spalten! AWT, Swing, JavaFX & SWT 10
C [Swing] JList JText 2 Spalten Modell prozentual verteilen AWT, Swing, JavaFX & SWT 2
D JTabel: Überschrift, Abstand zwischen Tabellen, Spalten-Farbe ändern AWT, Swing, JavaFX & SWT 2
B Swing GridLayout.add über 2 Spalten? AWT, Swing, JavaFX & SWT 7
M Sortierung und Vertauschen von Spalten in JTable AWT, Swing, JavaFX & SWT 6
F Spalten in JTable immer am rechten Tabellenrand AWT, Swing, JavaFX & SWT 3
B Swing JTable Spalten namen AWT, Swing, JavaFX & SWT 10
E Swing JTable Spalten ausblenden?! AWT, Swing, JavaFX & SWT 3
T jTable und farbige Spalten AWT, Swing, JavaFX & SWT 18
P GridBagLayout - zwei Spalten mit gleicher Größe AWT, Swing, JavaFX & SWT 11
B Swing JTable mit scrollbalken anhand von Spalten AWT, Swing, JavaFX & SWT 3
B Swing JTable Spalten merken AWT, Swing, JavaFX & SWT 6
E JTable nach mehreren Spalten sortieren AWT, Swing, JavaFX & SWT 14
B SWT SWT Tree mit mehreren Spalten AWT, Swing, JavaFX & SWT 3
F Swing J(X)Table Spalten umsortieren NUR im View (Wie finde ich eine Spalte nach Name?) AWT, Swing, JavaFX & SWT 3
H Swing TableCellRenderer für verschiedene Spalten AWT, Swing, JavaFX & SWT 11
J Swing JComboBox mit mehreren Spalten AWT, Swing, JavaFX & SWT 4
D Layout 2 unterschiedliche spalten AWT, Swing, JavaFX & SWT 7
S Swing JTable: Spalten mit relativer Breite im ungleichmäßigen Verhältnis AWT, Swing, JavaFX & SWT 2
G Tabelle Spalten unsichtbar machen AWT, Swing, JavaFX & SWT 5
D JTable Viewport - Ausgabe der sichtbaren Spalten AWT, Swing, JavaFX & SWT 2
K JTable Spalten nicht verschieben AWT, Swing, JavaFX & SWT 2
G JTable fixierte Spalten AWT, Swing, JavaFX & SWT 2
G TableModel mit anderen Spalten AWT, Swing, JavaFX & SWT 4
G JTable: Spalten & Zellen fixieren wie in Excel AWT, Swing, JavaFX & SWT 4
Tom299 JTable - Spalten verschieben deaktivieren? AWT, Swing, JavaFX & SWT 3
K kopf einer tabelle über mehrere spalten AWT, Swing, JavaFX & SWT 3
M JFace TableViewer + ContentProvider, wo sind die Spalten? AWT, Swing, JavaFX & SWT 6
E Spalten Farbe ändern AWT, Swing, JavaFX & SWT 3
ARadauer spalten überschriften von jtable sehr klein AWT, Swing, JavaFX & SWT 2
N JComboBox mit mehreren Spalten AWT, Swing, JavaFX & SWT 21
M JDBC + dynamischer JTable - Spalten problem AWT, Swing, JavaFX & SWT 5
O JTable, mehrere Spalten drucken AWT, Swing, JavaFX & SWT 4
B JTable mehrere Spalten | wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
N JTable Abstand zwischen einzelnen Spalten AWT, Swing, JavaFX & SWT 6
B Eine Spalte in drei verschiedenlange Spalten aufteilen AWT, Swing, JavaFX & SWT 2
J Zwei-Spalten Layout [Swing] AWT, Swing, JavaFX & SWT 3
A Bestimmte Spalten nicht editierbar machen AWT, Swing, JavaFX & SWT 6
S JTable - Spalten fixieren AWT, Swing, JavaFX & SWT 11
X JTable --> Anzahl der Spalten ändern AWT, Swing, JavaFX & SWT 8
L Tabelle mit 5 spalten und 2 Zeilen erzeugen AWT, Swing, JavaFX & SWT 4
R JList mit zwei Spalten AWT, Swing, JavaFX & SWT 2
N Beim Ziehen der Spalten immer ArrayIndexOutOfBoundsException AWT, Swing, JavaFX & SWT 4
T JList mit mehreren spalten AWT, Swing, JavaFX & SWT 2
borobudur zwei Spalten-Titeln bei JTable AWT, Swing, JavaFX & SWT 2
V Bestimmte Spalten im JTable nicht anzeigen AWT, Swing, JavaFX & SWT 2
L Header von ausgewählte Spalten ausgeben AWT, Swing, JavaFX & SWT 6
L Inhalt von ausgewählte Spalten aus JTable abfragen AWT, Swing, JavaFX & SWT 4
S JTable, mehrere Spalten/Zeilen zeitlich versetzt hinzufügen AWT, Swing, JavaFX & SWT 6
P TableCellRender für ALLE Spalten AWT, Swing, JavaFX & SWT 10
J JTable - Header über mehrere Spalten AWT, Swing, JavaFX & SWT 3
G JTable zur Laufzeit Spalten und Zeilen hinzufügen AWT, Swing, JavaFX & SWT 7
M Listbox mit 4 Spalten AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben