Verschiedene Modi bei AbstractTableModel

  • Themenstarter Themenstarter Marco_Adv
  • Beginndatum Beginndatum
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
 
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
 
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?
 
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();
   }
 
Ok danke nochmals nun ist die frage wie ich der abstract table klasse sage, welcher modus nun benutzt werden soll?
 
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..
 
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.
 
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?
 
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.

Zurück
Oben