addColumn-JTable

Hallo,

ich versuche eine Spalte in einer tabelle zu einfügen, es hat schon geklappt aber wenn ich die Zellen-Inhalt von der new spalte ändere, dann ändert sich auch die Zellen-Inhalt von der erste spalte.

was mache ich falsch? merci.

so sieht’s die Class aus:

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

class TableHeaderTest {
static JTable table ;

public static void main(String[] args) {
// JTable initialisieren und mit Inhalt füllen; siehe dazu Teil 2
table = new JTable(new String[][]{{„1“, „2“, „3“},{„4“, „5“, „6“}}, new String[]{„A“, „B“, „C“});

// JTableHeader holen
JTableHeader header = table.getTableHeader();

// ColumnModel holen:
TableColumnModel columnModel = header.getColumnModel();

// TableColumn erstellen
TableColumn aColumn = new TableColumn();
// setHeaderValue() setzt den Titel
aColumn.setHeaderValue(„D“);
// modelIndex zeigt an von welcher Spalte im DatenModel die neue Spalte ihre Werte holen soll
//aColumn.setModelIndex(1); // Index 1 im Model

columnModel.addColumn(aColumn);

// spalten nicht resizable machen, nicht zulassen dass die spaltenreihenfolge geändert werden kann
header.setResizingAllowed(false);
header.setReorderingAllowed(false);

// JFrame konstruieren
JFrame frame = new JFrame(„JTableHeader test“);
// Table in JScrollPane einfügen und dem Frame hinzufügen
frame.getContentPane().add(new JScrollPane(table));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}

Gruss.
hicham

Hallo,

ich versuche eine Spalte in einer tabelle zu einfügen, es hat
schon geklappt aber wenn ich die Zellen-Inhalt von der new
spalte ändere, dann ändert sich auch die Zellen-Inhalt von der
erste spalte.

was mache ich falsch? merci.

> // JTable initialisieren und mit Inhalt füllen  
> table = new JTable(new String[][]{{"1", "2", "3"},{"4","5", "6"}}, new String[]{"A", "B", C"});

Eine JTable hat eine Datenstruktur (=TableColumnModel) für die Spalten
(=TableColumn) und eine separate für die eigentlichen Tabellendaten
(=TableModel).

Um Spalten nach der Erstellung der Tabelle hinzuzufügen, musst Du diese also
in beiden Datenstrukturen hinzufügen. In Deinem Fall fehlt also die Anweisung,
die Spalte im TableModel hinzuzufügen.

Dazu musst Du TableModel verwenden, was das Hinzufügen von Spalten im Nachhinein
unterstützt: DefaultTableModel , siehe http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/….

Du erstellst also die JTable per new JTable(myDefaulTableModel), fügst
die Datenspalte mit myDefaulTableModel.addColumn(Object columnName, Object[] columnData)
hinzu und dann kommt die Spalte für das TableColumnModel mit Deinem Code

aColumn.setModelIndex(datenIndexDeinerNeuenSpalte); 
columnModel.addColumn(aColumn);

Gruß,
-Andreas.

Hallo,
Danke fur die Antwort.

Du erstellst also die JTable per new
JTable(myDefaulTableModel), fügst
die Datenspalte mit myDefaulTableModel.addColumn(Object
columnName, Object[] columnData)
hinzu und dann kommt die Spalte für das TableColumnModel mit
Deinem Code

aColumn.setModelIndex(datenIndexDeinerNeuenSpalte);
columnModel.addColumn(aColumn);

Ich habe deine Vorschlag gemacht und es hat funktioniert, aber der Benutzer hat keine Moglichkeit die Zellen zu anderen.

Ich werde genau erklaren was ich genau machen mochte:

Beim Starten der Applikation soll eine leer Tabelle mit 10 spalten dargestellt.
Die Zeilen sind dynamisch deshalb habe ich der Konstructur
JTable tab = new JTable(Vector v1; Vector v2)
Mittels der Delete-Button soll die Spalten 4 bis 7 geloscht werden.
Mittels der Insert-Button soll die Spalten 4 bis 7 eingefugt werden.
Der Benutzer hat die Moglichkeit die Zellen zu anderen und mit der Send-Button die neue Zellen-Inhalt verarbeiten zu konnen.

Wie kann ich sowas zu machen? Vielen Danke auf jede Hilfe.

Gruss.
Hicham

Hallo.

Beim Starten der Applikation soll eine leer Tabelle mit 10
spalten dargestellt.
Mittels der Delete-Button soll die Spalten 4 bis 7 geloscht
werden.
Mittels der Insert-Button soll die Spalten 4 bis 7 eingefugt
werden.
Der Benutzer hat die Moglichkeit die Zellen zu anderen und mit
der Send-Button die neue Zellen-Inhalt verarbeiten zu konnen.

So wie Du das beschreibst, willst Du eigentlich bestimmte
Spalten nicht löschen, sondern nur zeitweise ausblenden.

Wenn das stimmt, würde ich einen viel einfachere Lösung
vorschlagen:
Erstelle die Tabelle mit allen 10 Spalten und blende
bei Bedarf die Spalten 4-7 einfach aus.

Das Ausblenden bekommst Du hin, indem Du Dir die
entsprechende TableColumn von dem TableColumnModel
nimmst und ihre Breite auf 0 setzt:

int iOldWidth = tableColumn.getWidth();
int iOldPrefWidth = tableColumn.PreferredWidth();

tableColumn.setWidth(0);
tableColumn.setPreferredWidth(0);

Einblenden geht dann entsprechend mit:

tableColumn.setWidth(iOldWidth);
tableColumn.setPreferredWidth(iOldPrefWidth);

Siehe http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/….

Mit dieser Ausblendtechnik erspart Du Dir die kompliziertere
Synchronisation von TableColumnModel und TableModel.

Gruß,
-Andreas.

Hallo,

vielen Danke für deine interessanten idee.

ich habe eine andere frage:

in meiner Tabelle sollen die Daten nach zwei Kriteren sortiert:
Das erste Sortierkriterium ist die IP-Adresse „Spalte 2“.
Wenn es 2 gleichige IP-Adresse in der Tabelle gibt, dann ist das zweite Sortierkriterium die MAC-Adresse (Spalte 3).

Wie kann ich das machen? Danke.

Gruss.
Hicham

Hallo Hicham.

vielen Danke für deine interessanten idee.

Hat die Idee mit dem Spalten ausblenden Dein Problem nun gelöst?

ich habe eine andere frage:

in meiner Tabelle sollen die Daten nach zwei Kriteren
sortiert:
Das erste Sortierkriterium ist die IP-Adresse „Spalte 2“.
Wenn es 2 gleichige IP-Adresse in der Tabelle gibt, dann ist
das zweite Sortierkriterium die MAC-Adresse (Spalte 3).

Wie kann ich das machen? Danke.

Wie man Swing-Tabellen sortiert, findest Du hier:

http://www.objects.com.au:8088/objects/java/examples…

Probier das erst mal nach einer Spalte zu sortieren, wie in dem
Code-Beispiel. Wenn Du das geschafft hast, musst Du den dort
beschriebenen TableSorter auf 2 Spalten erweitern.

Viel Erfolg,
-Andreas.

Hallo Andreas

Hat die Idee mit dem Spalten ausblenden Dein Problem nun
gelöst?

Ich habe die Idee nicht ganz benutzt. Mein Problem habe ich mit zwei Tabellen gelöst weil die Spalten 2 verschiedene Eingenschaften haben sollen.

Jetzt stehe ich in anderem Problem:

ich habe die Tabelle mit Vectoren erzeugt new JTable(v1,v2), weil die Daten dynamisch sind, und jetzt muss ich einpaar Spalten nicht-editierbar lassen, d.h ich brauche eine AbstractTableModel zu definieren aber ich weisse nicht wie es mit meiner Vectoren implementieren soll? vorallem die Methode public Object getValueAt(int rowIndex, int columnIndex)

z.B public class SpaltenDeactivieren extends AbstractTableModel{
public int getColumnCount() {
return v1.size();
}
public int getRowCount() {
return v2.size();
}
public Object getValueAt(int rowIndex, int columnIndex) {
return ???;
}

public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex==1;
}
}
Hast du bitte eine Idee wie ich es lösen kann?

Gruss.
Hicham

Hallo,

Jetzt stehe ich in anderem Problem:

ich habe die Tabelle mit Vectoren erzeugt new JTable(v1,v2),
weil die Daten dynamisch sind, und jetzt muss ich einpaar
Spalten nicht-editierbar lassen, d.h ich brauche eine
AbstractTableModel zu definieren aber ich weisse nicht wie es
mit meiner Vectoren implementieren soll? vorallem die Methode
public Object getValueAt(int rowIndex, int columnIndex)

Das Problem habe ich auch gelöst und zwar:
public Object getValueAt(int rowIndex, int columnIndex)
{
v2=(Vector)v3.get(arg0);
return (String)v2.elementAt(arg1);
}
aber ich kann nicht die Daten der Zellen von der Oberfläche änderen, warum?

Gruss
Hicham

Hallo Hicham.

Jetzt stehe ich in anderem Problem:

Hast Du das Sortierproblem schon gelöst?

ich habe die Tabelle mit Vectoren erzeugt new JTable(v1,v2),
weil die Daten dynamisch sind, und jetzt muss ich einpaar
Spalten nicht-editierbar lassen, d.h ich brauche eine
AbstractTableModel zu definieren aber ich weisse nicht wie es
mit meiner Vectoren implementieren soll? vorallem die Methode
public Object getValueAt(int rowIndex, int columnIndex)

Hast du bitte eine Idee wie ich es lösen kann?

Ja, nimm einfach ein DefaultTableModel statt eines AbstractTableModel, siehe http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/…. Da ist mehr Funktionalität von der
Stange, ohne dass Du alle Hintergründe verstehen musst um ein so ein
Datenmodell für eine JTable bereitzustellen.

Dein Konstruktor ist dann DefaultTableModel(Vector vecWithRows, Vector vecColumnNames).

Der Parameter vecWithRows ist dabei ein zweidimensionaler
Vektor
. Hier ein Beispiel, wie so ein Vektor gefüllt wird:

Vector vecWithRows = new Vector();
int iNumberOfRows=15;
int iNumberOfColumns=7;
for (int r=0; r

Um bestimmte Zellen schreibgeschützt zu mache, leite
Dein eigenes Tabellenmodell von dem DefaultTableModel ab
und überschreibe die Methode 

    public boolean isCellEditable(int row, int column)

.

Gruß,
-Andreas.

Hallo Andreas,

Hast Du das Sortierproblem schon gelöst?

Ja.

Um bestimmte Zellen schreibgeschützt zu mache, leite
Dein eigenes Tabellenmodell von dem DefaultTableModel ab
und überschreibe die Methode

public boolean
isCellEditable(int row, int column)

.

genau und es hat supper geklapt, vielen Danke für deine Hilfe.

Gruss.
Hicham