JTable - Sortierung beibehalten

Shidan

Grünschnabel
Hallöchen,

Kurz und knapp, ich habe ein JTable das ich auch schön durch die AutoSortierMethode sortieren kann.

Die Daten des Tables werden aus einer CSV gelesen und auch wieder hineingeschrieben, das Problme ist nur das die SortierMethode zwar das Optische JTable sortiert aber leider nicht die Reihen Nummern anpasst und so müsste man nach jedem start die Tabelle wieder sortieren da ich sie nach den Nummern ja auch wieder auslese.

Ist es möglich das irgendetwas zu machen das die Daten richtig gespeichert werden und somit die Sortierung behalten bleibt.

Kleine Frage noch als Bonus , ist es möglich Leere Reihe IMMER an das Ende der Table drannzuhängen auch nach der Sortierung.
 
Ich denke die Standart nummern wenn man z.B
Java:
 table.getValueAt(2,3);
Aufruft.
Ich lass mir das JTable bei meiner Speichermethode in ein Vector<Vector> umwandeln da mir das DefaultTableModel diese Methode direkt bereitlegt, von dem hole ich mir dann wie als würde ich aus dem JTable die Werte holen nur mit den Methoden des Vectors die Werte.

Das Problem ist einfach das wohl die Sortierung nur oberflächlich erscheint und die Reihe 3 trozdem Reihe 3 bleibt obwohl sie an der Stelle von Reihe 7 ist.


Ich kann auchmal hier mein Table sowie meine Methode zum Speichern posten, diese sind aber schon etwas spezifischer und haben einen minimal größeren Umfang.

Java:
	private void tableSetData() {		
		String[] columnNames	= new String[week.length];					
			columnNames[0] 			= "Name";
			columnNames[1] 			= "Projekt";
			for(int i = 2; i < columnNames.length; i++){
				columnNames[i] = week[i-2];
			}
		//int nTablelength 		= table.length;
		String[][] data 		= new String[0][columnNames.length];		
		c_initData = InitData.fl;
		


		
		setDtm(new DefaultTableModel(data, columnNames){			
			 /**Eigenes DefaultTableModel um nur Zahlen auf der Tabelle 
			  * nach Zeile 2 zu zulassen.
			 */
			private static final long serialVersionUID = 1L;


			@Override
			    public void setValueAt(Object aValue, int row, int col)
			    {
			        // Abbruch wenn der Wert kein Integer ist.	
			        if (aValue instanceof Integer)
			        {
			        	//Abbruch wenn der Wert nicht zwischen 0 - 100 liegt.
			          int value = ((Integer)aValue).intValue();		
			        	  if(value < 0 || value > 100){
			        		  return;			        	  
			          }
			        }
			        // Setze den Wert.
			        super.setValueAt(aValue, row, col);
			    }

			 
			    @Override
			    public Class<?> getColumnClass(int col)
			    {
			        if (col >=2)
			            return Integer.class;
			        else{
			        	return String.class;
			        }
			    }			
		});		
		Vector<Vector<String>> filler = c_initData.get2DTable();		
		Vector<String> formatedVector = new Vector<String>();
		for(int i = 1; i < filler.size(); i++){
			
			formatedVector = filler.get(i);
			
			
			int z = filler.get(i).size()-1;			
			int gewollteKalenderwoche = c_initData.getWeekNow() + c_initData.getAnzahlWeeks();
		//	System.out.println(gewollteKalenderwoche);
			while(z >=  gewollteKalenderwoche-1){
				formatedVector.remove(z);
				z--;				
			}
			
			int k = c_initData.getWeekNow();
		//	System.out.println(k);
			while(k >= 2){
				try{			
					formatedVector.remove(k);
				}catch(ArrayIndexOutOfBoundsException ex){
					
				}
				k--;
			}

		
		//	System.out.println("Something: "+formatedVector);
			dtm.addRow(formatedVector);
		}		
		jTable = new GroupingTable(dtm, 0);
		jTable.setLayout(null);
		
		//c_TableM.save();

		
		
		jTable.setRowHeight(jTable.getRowHeight());
		jTable.setAutoCreateRowSorter(true);
		jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		for (int i = 0; i < dtm.getRowCount(); i++) {
			jTable.getRowSorter().convertRowIndexToModel(i);
		}		
		//ComboBoxen werden auf das JTable gelegt.
		TableColumn tColumnNames = jTable.getColumnModel().getColumn(0);
		comboBox_names = new JComboBox();
		TableColumn tColumnProjekts = jTable.getColumnModel().getColumn(1);
		comboBox_projekts = new JComboBox();
		
		jTable.addMouseListener(this);

		//ComboxBox f�r Namen und Projekte werden mit den Namen und Projekten gef�llt.
		comboBox_names.addItem("");
		comboBox_projekts.addItem("");
		for(int i = 0; i < namen.length; i++){
			comboBox_names.addItem(namen[i]);
		}

		for(int i = 0; i < projekt.length; i++){
			comboBox_projekts.addItem(projekt[i]);
		}
		
		//CellEditor f�r die ComboBoxen.
		tColumnNames.setCellEditor(new DefaultCellEditor(comboBox_names));
		tColumnProjekts.setCellEditor(new DefaultCellEditor(comboBox_projekts));

		// Neuer ColoredTableCellRenderer f�r die Einf�rbung der Tabellen.
	//	DefaultTableCellRenderer renderer = 
	//		new CustomTableCellRenderer ();
		
	//	tColumnNames.setCellRenderer(renderer);
	//	tColumnProjekts.setCellRenderer(renderer);	
	//	jTable.setDefaultRenderer(this.getClass(), new CustomTableCellRenderer());

		//ModelListener f�r die Tabelle um %te an Zahlen zu erg�nzen
		getDtm().addTableModelListener(this);

		//c_TableM.getNotFull();

	jTable.setFillsViewportHeight(true);					
						jTable.getTableHeader().setOpaque(true);
						jTable.getTableHeader().setResizingAllowed(true);

						for (int i = 0; i < jTable.getColumnCount(); i++) {
							TableColumn col = jTable.getColumnModel().getColumn(i);									
							col.setPreferredWidth(70);						
						}		
						
						Dimension size2 = jTable.getPreferredScrollableViewportSize();
						jTable.setPreferredScrollableViewportSize
					    (new Dimension(getSize().width, size2.height));						

						jTable.getTableHeader().setBounds(0, 0, jTable.getPreferredSize().width, 0);		
						jTable.getTableHeader().setReorderingAllowed(false);	
						jScrollPane.setViewportView(jTable);	
	}

Die Initalisierung der Table

Java:
  class GroupingTable extends JTable {
        /**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		private int keyColumn;
        private Color[] colorModel;
        private int[] colorIndex;   //"Model" zur Speichern der Zeilenfarbe
        
        public GroupingTable(TableModel model, int column) {
            super(model);
            this.keyColumn = column;
            colorModel = new Color[] {this.getBackground(), Color.LIGHT_GRAY};
            determineColor();
        }
        
        //tableChanged überschrieben, damit das "Farbenmodel" aktualisiert wird
        public void tableChanged(TableModelEvent evt) {
            if (evt.getColumn()==keyColumn)
                determineColor();
            super.tableChanged(evt);
        }
        
        //Methode zum Ermitteln der Zeilenfarbe
        private void determineColor() {
            colorIndex = new int[this.getRowCount()];
            if (colorIndex.length<=0)
                return;
            int colorCount=0;
            colorIndex[0] = colorCount;
            for (int row=1; row<this.getRowCount(); row++) {
            	
                if(this.getValueAt(row, this.convertColumnIndexToView(keyColumn)) != null && this.getValueAt(row, this.convertColumnIndexToView(keyColumn))
                        .equals(this.getValueAt(row-1, this.convertColumnIndexToView(keyColumn))))
                    colorIndex[row] = colorCount & 1;
                else
                    colorIndex[row] = ++colorCount & 1;
            }
        }
        
        //überschrieben, um die Zeilenfarbe zu setzen.
        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
            Component c = (Component) super.prepareRenderer(renderer, row, column);
            for (int i=0; i<this.getSelectedRows().length; i++) {
                if (this.getSelectedRows()[i]==row)
                    return c;
            }
            try{
            	c.setBackground(colorModel[colorIndex[row]]);
            }catch(ArrayIndexOutOfBoundsException ex){
            	
            }
            return c;
        }
    }

Eine bearbeitete Tableklasse zum einfärben der Tabellen.
 
Zuletzt bearbeitet von einem Moderator:
Ich hab genau das gleiche Problem.
Die Sortierung tut wunderbar. Allerdings nur "oberflächig".

Ich habe ein JTable mit Daten drin. Wenn ich Doppelklick auf die Zeile mache wird ein Bearbeitungsfenster geöffnet in dem die Daten angepasst werden können.

Klappt bis zur Sortierung wunderbar.

Wenn nun Nach einer anderen Spalte sortiert wird, dann kann ich immer noch problemlos die z.B. zweite Spalte doppelklicken und dann öffnet sich aber auch das Bearbeitungsfenster, ABER es ist immer noch die zweite Zeile der ursprünglich sortieren Tabelle :/.


EDIT:
Hier zwei Bilder zu Verdeutlichung:

sortiert.png

Hier passt alles. Zweite Spalte ausgewählt und Doppelklick öffnet das Menu.

unsortiert.png
Hier nicht mehr. Hier wurde nach Preisen sortiert, aber die Tabelle öffnet intern wohl immer noch Zeile 2 :/

EDIT 2:

Mein Code:
Code:
int row = table.getSelectedRow();			
			daten.lade_alle_Akku_aus_DB();
			QuerryGenerator gen = new QuerryGenerator();
			Akku temp = new Akku();

			temp = gen.get_Akku_per_ID(Integer.parseInt(((DefaultTableModel) table.getModel()).getValueAt(row, 0).toString()));
			gui_Teile_bearbeiten bearbeiten = new gui_Teile_bearbeiten(daten, table, row, "Akku", temp.get_ID(), temp.get_FK_Hersteller(), temp
				.get_Einkaufspreis_netto(), temp.get_Verkaufspreis_netto(), temp.get_Bezeichnung(), temp.get_Beschreibung(), temp
				.get_Bild());
			bearbeiten.anzeigen(true);
 
Zuletzt bearbeitet:
Hm ich habe keine Liste. Ich lade die Daten aus der Datenbank und haue sie direkt in die Tabelle:


Code:
for (int i = 0; i < daten.getAkkuliste().length; i++)
	{
	    
	    String herstellername = "";
	    for (int a = 0; a < daten.getHerstellerliste().length; a++)
	    {

		if (daten.getAkkuliste()[i].get_FK_Hersteller() == daten.getHerstellerliste()[a].get_ID())
		{
		    herstellername = daten.getHerstellerliste()[a].get_Firmenname();
		}
	    }

	    ((DefaultTableModel) table.getModel()).addRow(new Object[] { daten.getAkkuliste()[i].get_ID(), herstellername,
		    daten.getAkkuliste()[i].get_Einkaufspreis_netto(), daten.getAkkuliste()[i].get_Verkaufspreis_netto(),
		    daten.getAkkuliste()[i].get_Bezeichnung(), daten.getAkkuliste()[i].get_Beschreibung(), daten.getAkkuliste()[i].get_Bild() });

	}

Code:
private Akku[] akkuliste;

Das heißt dass ich hier in dem Fall meine Array aus Akkus nehmen muss und einen Sorter für schreiben muss der mir das nach ID, Herstellername, Preis etc sortiert? Der RowSorter ist nur für die Tabelle also nur für die Optik (den musst ich auch neu schreiben für den Datentyp BigDecimal)?
 
Zuletzt bearbeitet:
Wenn du keine Liste hast, dann mach dir eine Liste, schreib den ganzen kram aus der Datenbank in die Liste, sortiere dir die Liste so wie du sie gerne möchtest (Alphabetisch oder was weiß ich) und nimm die Tabelle lediglich zur Darstellung der Liste... ;-)

Gruß
 

Neue Beiträge

Zurück