Verschiedene Modi bei AbstractTableModel

Status
Nicht offen für weitere Antworten.
M

Marco_Adv

Gast
Hallo zusammen,

ich habe eine ComboBox in der ich aus 2 Möglichkeiten auswählen kann.
1. Meine Liste
2. Alle Einträge

Desweiteren habe ich ein AbstractTableModel implementiert welches bei auswahl der 2. Selektion eine tabelle anzeigt mit den Spalten:
Element;User;Beschreibung.

Nun soll dieses Model so aufgespalten werden, dass wenn ich Meine Liste auswähle die Spalten:
Element;Level;Beschreibung angezeigt werden.

Dies soll so implementiert werden, dass ich kein weiter bzw neues AbstractTableModel benötige,
hat hierzu jemand eine Idee?
Den Code des Models habe ich hier:
Code:
public class ReleaseElementTableModel extends AbstractTableModel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Color editColor = new Color(0,160,0);
	private Color releasedColor = Color.lightGray;

	List rows = new ArrayList();
	String[] columnNames = {"Element", "User", "Beschreibung"};

	public int getColumnCount() {
		return columnNames.length;
	}

	public int getRowCount() {
		return rows.size();
	}

	public Object getValueAt(int rowIndex, int columnIndex) {
		ReleaseElement row = (ReleaseElement) rows.get(rowIndex);
		DecorationWrapper wrapper;
		switch(columnIndex) {
		case 0:
			wrapper = new DecorationWrapper(row.getFullName(), 
							row.isReleased() ? releasedColor : editColor,
							row.isReleased() ? Font.PLAIN : Font.BOLD);
			return wrapper;
		case 1:
			wrapper = new DecorationWrapper(row.getUserId(), 
					row.isReleased() ? releasedColor : null,
					Font.PLAIN);
			return wrapper;
		case 2:
			wrapper = new DecorationWrapper(row.getDescription(), 
					row.isReleased() ? releasedColor : null,
					Font.PLAIN);
			return wrapper;
		}
		return null;
	}

	public String getColumnName(int i) {
		if(columnNames.length > i) {
			return columnNames[i];
		} else {
			return "";
		}
	}
	
	public void setData(List data) {
		rows = new ArrayList();
		rows.addAll(data);
		this.fireTableDataChanged();
	}
	
	public List getData() {
		return rows;
	}
	
	public ReleaseElement getElement(int index) {
		return (ReleaseElement) rows.get(index);
	}
	
	public ReleaseElement removeEntry(int i) {
		ReleaseElement element = null;
		if( i < rows.size()) {
			element = (ReleaseElement)rows.remove(i);
			fireTableRowsDeleted(i, i);
		}
		return element;
	}
	
	public void addEntry(int i, ReleaseElement element) {
		if( i >= rows.size()) {
			rows.add(element);
			i = rows.size() - 1;
			fireTableRowsInserted(i, i);
		} else {
			rows.add(i, element);
			fireTableRowsInserted(i, i);
		}
	}

    /**
     *  Returns false.  This is the default implementation for all cells.
     *
     *  @param  rowIndex  the row being queried
     *  @param  columnIndex the column being queried
     *  @return false
     */
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    		return false;
    }

    /**
     *  This empty implementation is provided so users don't have to implement
     *  this method if their data model is not editable.
     *
     *  @param  aValue   value to assign to cell
     *  @param  rowIndex   row of cell
     *  @param  columnIndex  column of cell
     */
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {

    	if( aValue instanceof String ) {
    		
    		ReleaseElement row = (ReleaseElement) rows.get(rowIndex);
			switch(columnIndex) {
			case 0:
				row.setElementId((String)aValue);
			case 1:
				row.setType((String)aValue);
			}
    	}
    }

}


Vielen Dank im voraus
 
S

SlaterB

Gast
grundsätzlich musst du einfach nur dein TableModel richtig trimmen,
also es muss abhängig vom Zustand (boolean-Feld)
bei getColumnName(), getColumnCount() und getValueAt/ setValueAt usw richtig reagieren,

dann noch beim Wechsel ein fireTableStructureChanged()-Aufruf,
und die Tabelle sollte sich neu aufbauen
 
M

Marco_Adv

Gast
Also danke erstmal das heißt für mich also ich übergebe beim aufrug der Methoden einfach einen Flag mit und baue die Tabelle dann dementsprechend auf? also mach an jede Methode eine If Abfrage?
 
S

SlaterB

Gast
die Operationen werden von JTable aufgerufen, da kannst du keinen Parameter mitgeben,
dass muss intern geregelt werden,
a la

Code:
private booolean isTypeB;
private String[] columnNamesA = {"Element", "User", "Beschreibung"}; 
private String[] columnNamesB = {"Element", "Level", "Beschreibung"}; 


  public String getColumnName(int i) { 
      String[] names = this.columnNamesA;
      if (this.isTypeB) {
         names = this.columnNamesB;
      }
      if(names.length > i) { 
         return names[i]; 
      } else { 
         return ""; 
      } 
   } 


   public void setTypeB(boolean) {
       this.isTypeB = ..;
       fireTableStructureChanged();
   }
 
M

Marco_Adv

Gast
Ok danke nochmals nun ist die frage wie ich der abstract table klasse sage, welcher modus nun benutzt werden soll?
 
S

SlaterB

Gast
tja, Information muss im Programm vorhanden sein, sonst gehts halt nicht ;)

bei der ComboBox ein Listener und dort amTableModel-Objekt die Operation aufrufen,
Objekt muss natürlich bekannt sein,

das sind allgemeine Java-Fragen, wie ein Objekt mit anderen kommunizieren kann..
 
M

Marco_Adv

Gast
Also es funktioniert soweit einwandfrei nur das Problem ist sobald ich
fireTableStructureChanged(); aufrufe, stirbt mein DecorationWrapper doch rufe ich diese methode nicht auf, sonst werden die columns nicht geändert, ein tbelChange event funktioniert auch nicht hab ich schon probiert.
 
S

SlaterB

Gast
was heißt denn 'stirbt'?
Anzeigefehler, Exception, ..?

funktioniert es denn, wenn du von Anfang an den anderen Zustand wählst?
was ist das für eine Klasse? läuft es ohne die, wenn du nur Strings zurückgibst?
 
M

Marco_Adv

Gast
Es wird gar nicht angezeigt die Klasse sieht wie folgt aus:
Code:
public class DecorationWrapper {
	
	private Object value;
	private Color color;
	private int fontStyle = -1;
	
	public DecorationWrapper(Object value, Color color) {
		this.value = value;
		this.color = color;
	}

	public DecorationWrapper(Object value, Color color, int fontStyle) {
		this.value = value;
		this.color = color;
		this.fontStyle = fontStyle;
	}

	public Color getColor() {
		return color;
	}
	
	public int getFontStyle() {
		return fontStyle;
	}
	
	public String toString() {
		if(value == null) {
			return "null";
		} else {
			return value.toString();
		}
	}
}
und der cellRenderer:
Code:
public class DecoratedTableCellRenderer extends DefaultTableCellRenderer {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Color standardForeground;
	private Color standardSelection;
	private Font standardFont;
	private Font plainFont;
	private Font italicFont;
	private Font boldFont;

	public DecoratedTableCellRenderer() {
		super();
		standardForeground = UIManager.getColor("Table.foreground");
		standardSelection = UIManager.getColor("Table.selectionForeground");
		standardFont = UIManager.getFont("Table.font");
		plainFont = new Font(standardFont.getFamily(), Font.PLAIN, standardFont.getSize());
		boldFont = new Font(standardFont.getFamily(), Font.BOLD, standardFont.getSize());
		italicFont = new Font(standardFont.getFamily(), Font.ITALIC, standardFont.getSize());		
	}

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
    	Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    	// get Element for ToolTip and createToolTip
    	ReleaseElementTableModel elementTableModel = (ReleaseElementTableModel)table.getModel();
    	ReleaseElement element = (ReleaseElement)elementTableModel.getElement(row);
    	createElementToolTip(element);
    	
    	if(value instanceof DecorationWrapper) {
			DecorationWrapper colorObject = (DecorationWrapper)value;
			Color elementColor = colorObject.getColor();
			if(elementColor != null) {
				switch (colorObject.getFontStyle()) {
				case Font.PLAIN:
					setFont(plainFont);
					break;
				case Font.BOLD:
					setFont(boldFont);
					break;
				case Font.ITALIC:
					setFont(italicFont);
					break;
				default:
					setFont(standardFont);
				}
				if(!isSelected) {
					setForeground(elementColor);
				} else {
					setForeground(standardSelection);
				}
				return comp;
			}
		} 

		setFont(standardFont);
		if(!isSelected) {
			setForeground(standardForeground);
		} else {
			setForeground(standardSelection);
		}
		
    	return comp;
    	
    }

und egal wo ich den event feuere wirden diese cellrender nicht ausgeführt bzw wird nicht angezeigt nur die liste
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Verschiedene Versionen mit Datenbanken Allgemeine Java-Themen 3
Thallius Verschiedene entities für gleichen Code…. Allgemeine Java-Themen 8
OnDemand Zentrale "Drehscheibe" für verschiedene APIs Allgemeine Java-Themen 14
M verschiedene Dokumente auslesen Allgemeine Java-Themen 1
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
J Verschiedene Runtime Versionen gleichzeitig? Allgemeine Java-Themen 12
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
K Verschiedene Sprachen Allgemeine Java-Themen 1
C -Verschiedene Versionen eines Programms verwalten Allgemeine Java-Themen 7
M Verschiedene Pilzartenerkennung Allgemeine Java-Themen 0
I Verschiedene Arrays auslesen Allgemeine Java-Themen 6
nrg Verschiedene JREs im Browser konfigurieren Allgemeine Java-Themen 6
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
G DesignPattern Verschiedene Services Allgemeine Java-Themen 4
B Verschiedene Objekte in Abhängigkeit eines Typs instanziieren. Allgemeine Java-Themen 17
M massenhaft verschiedene Date-Pattern Allgemeine Java-Themen 3
R Eclipse Verschiedene Ergebnisse bei Berechnung eines double-Werts Allgemeine Java-Themen 5
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
faetzminator verschiedene Beans, verschiedene Felder "koppeln" Allgemeine Java-Themen 3
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
S Welche Datenstruktur für verschiedene Sprachen sinnvoll? Allgemeine Java-Themen 2
H Zwei verschiedene Dateien mittels einem Binärstream übertragen? Allgemeine Java-Themen 13
M verschiedene Methonden innerhalb des gleichen Threads Allgemeine Java-Themen 7
N verschiedene Klasse laden (Designfrage) Allgemeine Java-Themen 2
S Package in verschiedene Projekten einbinden? Allgemeine Java-Themen 3
D Verschiedene Datein aus einer Zip Datei ins Programm laden Allgemeine Java-Themen 4
D Verschiedene Persistenz Strategien Allgemeine Java-Themen 7
S Konstruktoren, verschiedene Klassen, Methoden. Allgemeine Java-Themen 3
J Verschiedene Klassen, verschiedene Ströme? Allgemeine Java-Themen 6
V 1 Methode für viele verschiedene Klassen? Allgemeine Java-Themen 9
L Verschiedene Versionen eines Interfaces Allgemeine Java-Themen 12
J Verschiedene Starteinstellungen Allgemeine Java-Themen 7
J Programm für verschiedene Betriebssystem vertreiben? Allgemeine Java-Themen 10
M 2 verschiedene LookAndFeels in einem Fenster möglich? Allgemeine Java-Themen 6
D Gehts praktischer? Thema:Verschiedene Instanzen einer Klasse Allgemeine Java-Themen 3
C Verschiedene JDKs Allgemeine Java-Themen 6
M Regular Expression - verschiedene Ausdrücke testen (grep | ) Allgemeine Java-Themen 5
C verschiedene Klassenarten Allgemeine Java-Themen 3
G Verschiedene Auflösungen Allgemeine Java-Themen 6
H verschiedene Java Versionen Allgemeine Java-Themen 3
A Textfeld soll verschiedene Datumseingaben akzeptieren Allgemeine Java-Themen 5
K JAVA Fenster-Modi Allgemeine Java-Themen 5
R Importieren von Txt-Dateien in AbstractTableModel Allgemeine Java-Themen 0
W JTable mit AbstractTableModel ändern funktioniert nicht Allgemeine Java-Themen 16

Ähnliche Java Themen

Neue Themen


Oben