TableSorter

Status
Nicht offen für weitere Antworten.
G

Gast2

Gast
Hallo zusammen !

Ich habe Probleme mit dem TableSorter wenn er Zahlen sortieren soll
Folgende Zahlen 1,2,35,5,6,76
werdem so sortiert 76,6,5,35,2,1
warum ist die 35 mittendrin und nicht an 2ter stelle????Ich habe das gefühl,dass er nur die 1.Ziffer vergleicht.

Code:
		   	sorter = new TableRowSorter(); 
	      getTableHeader().addMouseListener(new MouseAdapter() {
	            public void mousePressed(MouseEvent evt) {
	            	setRowSorter( sorter ); 
	            	if(update)
	            	{
	            		
		            	
		            	sorter.setModel( getTabellenModel() ); 
                                                sorter.sort();
	            		update=false;
	            	}
	            	else
	            	{
	            		
	            		update=true;
	            	}

	            }
 
G

Guest

Gast
Hängt vermutlich damit zusammen, dass dein TableModel die Spaltenwerte als String zurückgibt, nicht als Number (Integer, Long etc.)
Siehe TableModel#getColumnClass(int columnIndex)
 
G

Gast2

Gast
und wie finde ich heraus was in dieser Zelle für ein Wert ist, weil ich ja die dazugehörige row nicht hab ....
sollte ja irgendwas zum parsen haben
 
S

SlaterB

Gast
diese Frage stellt sich der TableSorter auch und nimmt deshalb einfach Strings ;)

wenn du die Spalten nicht vorher kennst, dann musst du z.B. alle Strings in der Spalte anschauen,
nur Zahlen -> Spalte nach Zahlen sortieren
 
G

Gast2

Gast
du meinst schon in der methode getColumnClass(int columnIndex)

oder

bevor ich den sorter aufrufe
 
S

SlaterB

Gast
was ich meine ist weniger wichtig, als was du meinst, aber: ja
 
G

Gast2

Gast
aber ich kann ja schlecht jedes mal wenn die methode aufgerufen werden die ganzen Zellen jedesmal durchgehen.
 
S

SlaterB

Gast
die wird gar nicht mal sooft aufgerufen, aber richtig:

ne, nur einmal vorher, und diese Info speichern (im TableModel)
 
G

Gast2

Gast
die wird doch für jede Zelle aufgerufen oder nur für jede Spalte einmal ????

also ich geh die Spalte durch und schaue z.B. ob alle Zahlen float sind,
muss ich dann mit setValueAt methode die zahl nochmal explizit als float überschreiben???

und angenommen in Spalte 2 sind alle float Werte dann geb ich in der methode einfach Floa.class zurück??
und dann sollte es vielleciht funtkionieren ;)
 
S

SlaterB

Gast
> die wird doch für jede Zelle aufgerufen oder nur für jede Spalte einmal ????

ich weiß es nicht genau (habe s nur so in Erinnerung), fände das aber sehr inperformant von der JTable,
sowas kann man sich doch merken nachdem es einmal abgefragt wurde..

bei jedem Neuzeichen und Änderungen in der Tabelle neu, ok,
aber (hoffentlich) nicht pro Zeile während eines Zeichendurchgangs

> und angenommen in Spalte 2 sind alle float Werte dann geb ich in der methode einfach Floa.class zurück??

so ist das gedacht

> muss ich dann mit setValueAt methode die zahl nochmal explizit als float überschreiben???

für mich persönlich jetzt zuviel Detail, weiß ich nicht,
ist aber wahrscheinlich so oder so zu empfehlen, damit der Sortierer nicht ständig Strings in Floats umwandeln muss (falls er das bei Strings macht, weiß ich auch nicht genau),
ausprobieren was klappt
 
G

Gast2

Gast
Code:
//imHeader beim mousepressed
	            	if(update)
	            	{
	            		JTableHeader    header = (JTableHeader) evt.getSource();
	            		int column = header.getColumnModel().getColumnIndexAtX(evt.getX());
	            		for(int i=0;i<tModel.getRowCount();i++)
	            		{
	            		
	            			try
	            			{
	            			Float.parseFloat(tModel.getValueAt(i,column).toString());
	            			tModel.setColumnFloat(column);
	            			}
	            			catch (Exception e)
	            			{
	            			tModel.setColumnFloat(-1);
	            			return;	
	            			}
	            		}
		            	sorter.setModel( getTabellenModel() );
		            	//setModel(getTabellenModel());
		            	update=false;
	            	}
	            	else
	            	{
	            		
	            		update=true;
	            	}
	            	setRowSorter( sorter );

Code:
      public Class getColumnClass(final int columnIndex) 
      { 
    	  if(getColumnFloat()==columnIndex)
    	  {
    	  return types [Float.class]; 
    	  }
    	  return types [String.class]; 
      }

bekomm ich die Fehlermeldung 3 mal sogar


Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Cannot format given Object as a Number
at java.text.DecimalFormat.format(Unknown Source)
at java.text.Format.format(Unknown Source)
at javax.swing.JTable$DoubleRenderer.setValue(Unknown Source)
at javax.swing.table.DefaultTableCellRenderer.getTableCellRendererComponent(Unknown Source)
at javax.swing.JTable.prepareRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintDraggedArea(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)


also ich versuchsmal mit der setValueAt vielleicht hilfts
 
S

SlaterB

Gast
String scheint also Banane zu sein,

> setValueAt vielleicht hilfts

ja wie jetzt, ist doch in deinem Model, da musst du doch wissen, was genau das bewirkt,
wie sind die Daten überhaupt abgelegt?

edit: oh, habe gelesen 'setValueAt hilft nicht'
 
G

Gast2

Gast
Code:
public void setValueAt(Object value, int row, int col) 
  { 	
      ((Object[]) (oData[row]))[col] = value;
    //  super.fireTableCellUpdated(row, col); 
   }


ich hol meine Daten aus der DB und dort sind sie alle als String abgespeichert..

ja des mit String.class passt schon aber das Float.class mag er nicht so

meckert immer noch am gleichen rum :(
 
G

Gast2

Gast
ok also er sortiert jetzt richtig ABBBERRR

er wandelt meine Zahlen 5.00 in 5 um
und Zahlen von 76.12 ind 76,12......
und schreibt die Zahlen nach rechts
 
S

SlaterB

Gast
von Formatierung war nie die Rede, da gibts bestimmt auch was,
(TableCellRender oder so)
ich kann dazu aber nix genaues sagen, Forum-Suche, Suchmaschine, neuer Thread
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben