Zeilen in JTable ausblenden

Leyja

Mitglied
Hallo,

ich hab diesbezüglich schon die Suchfunktion benutzt, hatte aber leider ein wenig meine Verständnisschwierigkeiten damit, bzw. es war nicht ganz das, was ich brauchte.

Ich habe eine Tabelle, in der ich Spalten und Zeilen ausblenden will. Bei den Spalten habe ich es endlich geschafft, die Breite der jeweiligen SPalte einfach auf 0 zu setzen, so dass sie nicht mehr angezeigt werden.
Gibt es so eine Möglichkeit auch für die Zeilen?
Bisher hab ich es so gelöst, dass ich einfach die Inhalte verdoppelt habe. Bei den Inhalten, die über das Tablemodel ausgegeben werden, kann ich dann Zeilen rauslöschen und wenn ich die Zeilen wieder einfügen möchte, gucke ich in dem anderen Speicher und hole mir die benötigten Inhalte da raus und pack sie wieder in den anderen.
Das ganze ist aber extrem umständlich, die Methode für das Einfügen ziemlich lang. :-/
Da ich nun aber auch noch ermöglichen soll, dass Zellen geändert werden können bzw. die Datentypen der Werte geändert werden sollen, müsste ich das für beide Inhaltsspeicher machen, da sonst beim Löschen und später wieder einfügen ja aktualisierte Daten nicht mehr vorhanden sind.

Wäre also toll, wenn es auch eine Möglichkeit gäbe, irgendwie auf verdoppelte Inhalte zu verzichten. ^^" Bin mit meinem Latein am Ende und die Zeit wird leider auch knapp ._. Andernfalls müsste ich wohl doch beim Zellenbearbeiten meine Methoden so erweitern, dass beide Speicher geändert werden :-/

Vielen Dank schonmal im Voraus,
Leyja
 
Hallo,

ich hätte es wohl so gelöst :

In meiner Datenstruktur für die Zeilen hätte ich ein boolsches Feld angelegt das
mir sagt ob diese Zeile anzuzeigen ist oder nicht.
Die Methode getRowCount() und getValueAt() müssen natürlich entsprechend
ihre Rückgabewerte bilden.

Kommt es hinsichtlich zur Sichtbarkeit der Zeilen zu Änderungen im Model muß
nur eben dem JTree dieses per Event Mitgeteilt werden !

Gruß JAdix
 
In meiner Datenstruktur für die Zeilen hätte ich ein boolsches Feld angelegt
Kannst du mir ein bisschen genauer erklären, wie du das meinst?
Bei einer Tabelle ist das leider so, dass ich praktisch pro Spalte ein Objekt ausgebe und in jeder Zeilte dann eben ein bestimmtes Attribut dargestellt wird, was für jedes dieser Objekte gilt. Ist das dann auch möglich?

Und kannst du mir eventuell auch sagen, wie ich getRowCount und getValueAt ändern müsste?
Sind bestimmt total doofe Frage ._. Aber ich hab jetzt seit 2,5 Wochen nix anderes gemacht als Java und hab das Gefühl, ich werd immer dümmer *g*
 
Hallo,

weil ich zur Zeit selber kein Projekt am Start hab und mir gern die Zeit
hier vertreibe und mit deiner Rückfrage gerechnet habe, habe ich mal etwas
zusammengetippt ! :)

Ein Beispiel TableModel welches meine Idee umsetzt :
Code:
import javax.swing.table.AbstractTableModel;

public class MyTableModel extends AbstractTableModel {

	MyRowModel root = null;
	
	/* innere Klasse zur Datenkapselung 
	 * implementiert eine einfachverkettete Liste
	 */
	
	class MyRowModel {

		// Sichtbare Felder
		private Integer integer = null;
		private String string = null;
		private Float floatval = null;
		
		// Nicht sichtbare Felder
		private MyRowModel next = null;
		private boolean visible = true;
		
		// Simpler Konstruktor
		public MyRowModel(int i,String s,float f) {
			
			this.integer = new Integer(i);
			this.string = s;
			this.floatval = new Float(f);
		}

		// Vorne in Liste einfügen
		public void add(MyRowModel row) {
			this.next = row;
		}
		
		// Hinten an Liste anhängen
		public void append(MyRowModel row) {
			
			if ( next==null ) {
				this.next = row;
			} else {
				this.next.append(row);
			}
		}
		
		// Durchzählen 
		public int count() {
			
			if (this.next==null) {
				return (visible?1:0);
			} else {
				return (this.next.count()+(visible?1:0));
			}
		}
		
		// Sichtbarkeit setzen (String abhängig)
		public void setVisibleFor(String s,boolean v) {

			if (this.string.equals(s)) visible = v;
			
			if (this.next!=null) {
				this.next.setVisibleFor(s,v);
			}
		}

		// Wert für Zelle ausgeben
		public Object getValue(int rowIndex, int columnIndex) {

			if (visible && rowIndex==0) {
				
				switch (columnIndex) {
				
					case 0 : return integer;
					case 1 : return string;
					case 2 : return floatval;
				}

				return null;
				
			} else {
				return next.getValue(rowIndex-(visible?1:0),columnIndex);
			}
		}
	} // - innere Klasse ENDE
	
	// Feste Spalten Zahl 3
	public int getColumnCount() {
	
		return 3;
	}

	// Dynamische Zeilenzahl
	public int getRowCount() {
		
		if (root==null) {
			return 0;
		} else {
			return root.count();
		}
	}

	// Zellenwert augeben 
	public Object getValueAt(int rowIndex, int columnIndex) {
		
		if(root!=null) {
			return root.getValue(rowIndex,columnIndex);
		} else {
			return null;
		}
		
	}

	// Zeile vorne hinzufügen 
	public void add(int i,String s,float f) {

		MyRowModel row = new MyRowModel(i,s,f);
		row.add(root);
		root=row;
		this.fireTableDataChanged();
	}
	
	// Zeile hinten anhängen
	public void append(int i,String s,float f) {

		MyRowModel row = new MyRowModel(i,s,f);
		if (root==null) {
			root=row;
		} else {
			root.append(row);
		}
		this.fireTableDataChanged();
	}

	// Sichtbarkeit für Zeile setzen 
	public void setVisibleFor(String s,boolean v) {
		
		if (root!=null) { root.setVisibleFor(s,v); }
		this.fireTableDataChanged();
	}
}

Ab welcher Zeilenzahl die Sache mit der einfachverketteten Liste so eher "suboptimal"
ist lasse ich mal dahingestellt !
Ob du den Code an dein Projekt anpassen kannst, weiß ich auch nicht !

Aber es Funktioniert soweit ! Evtl. gibts noch kleine Schönheitsfehlerchen !

Gruß JAdix
 
Hi,

vielen Dank für die Hilfe :) Ein paar Fragen hab ich aber noch.
Ich bin zum einen etwas verwirrt, was die Felder betrifft. Versteh ich das jetzt richtig, dass ich eine Tabelle habe, die drei Spalten hat, wo in Spalte 1 Integerwerte, in Spalte 2 Strings und in Spalte 3 Float-Werte stehen?

Und was genau passiert bei hinten/vorne in die Liste einfügen? Entferne ich die Zeile und packe sie dann anschließend entweder vorne oder hinten wieder in die Tabelle, wenn ich sie einfügen will?

Wenn ja, ist das leider nicht so ganz das, was ich brauche. Normalerweise ist das ja (so wie ich das auch mit den Spalten bei dir verstanden habe) so, dass eben eine Spalte für einen Datentyp da ist und die Zeile das Objekt symbolisiert.
Bei uns ist es leider genau andersrum, in einer Zeile stehen die Attribute, die zu den Objekten, die spaltenweise dargestellt werden, gehören.
Die Zeilen müssten daher auch genau an die gleiche Stelle wieder, wo sie vorher waren.

Aber vielleicht hab ich deinen Code auch völlig missverstanden?

Und was genau meintest du damit, dass ich dann für mein TableModel die RowCount und GetValueAt-Methoden anpassen muss? Oder ist das dann nicht mehr der Fall?
 
Hallo,

Deine Annahmen zur Struktur der Tabelle sind Richtig.
Für das Beispiel habe ich mal ein int, ein String und ein float genommen.
Den int- und float-Wert noch in ihr Objektformat gebracht um die Konventionen
für den Rückgabewert der getValue-Methode zu erfüllen.
Anstatt der 3 separaten Felder hätte es auch ein Object-Array getan,
dann hätte man die case-Struktur gegen einen direkten Aufruf über den Index ersetzen können.
Diesen Teil des Codes, auf die von Dir benötigten Felder/Spalten zu ändern sollte kein Problem darstellen.

Das add fügt eine neue Zeile als erstes Element ein, append hängt sie hinten an.
Eine remove-Methode fehlt, ist aber auch nicht so schwierig die noch dazu zu tippen !

Was nun das ein und ausblenden einer Zeile angeht dazu, gibt es in dem Beispiel die
setVisibleFor-Methode. Ein Beispiel :

Spalte 1 . . Spalte 2 . . Spalte 3
. . 1 . . . . "Eins" . . . . 1.0
. . 2 . . . . "Zwei" . . . . 2.0
. . 3 . . . . "Drei" . . . . 3.0


Ein setVisibleFor("Zwei",false); würde die zweite Zeile verstecken. Die Zeile bleibt aber
im Model erhalten wird aber beim getRowCount und getValue nicht mehr berücksichtigt !
Mit setVisibleFor("Zwei",true); wäre die Zeile wieder sichtbar !
Gäbe es mehrere Zeilen mit dem String "Zwei" in der Spalte würden alle ein bzw.
ausgeblendet.
Die Bedingung für das setVisibleFor von String auf etwas anderes zu ändern sollte
auch kein Problem sein !

Hoffe jetzt ist der Code verständlicher

Gruß JAdix
 
Zurück