TableSorter

SirWayne

Erfahrenes Mitglied
Hallo zusammen,

1. Ich möchte in meiner JTable gerne alles in linksbündig(auch Zahlen) anzeigen lassen.
2. ich habe Zahlen die vor dem sortieren 35.00 aussehen und danach 35.0 aussehen...oder ich hab eine zahl 76.12 die danach so aussieht 76,12
Es ist eine "reine" Float-Objekt Spalte
 
Moin!
1.:
((JLabel)(yourTable.getDefaultRenderer(Object.class))).setHorizontalAlignment(SwingConstants.LEFT);
((JTextField)(yourTable.getDefaultEditor(Object.class))).setHorizontalAlignment(JTextField.LEFT);

Falls du noch andere Renderer / Editoren hast, musst du es bei diesen eventuell auch setzen

2.:
Da ich keine Ahnung habe, wie du sortierst, was dein Algo so macht, kann ich dazu auch nix sagen..

*grüssle*
MeinerEiner
 
mhm also dass mit dem Sorter klappt nicht so wirklich!!
Es sind alle Daten als String gespeichert....Nun wollte ich folgender maßen meine Double Werte Sortieren

Code:
//in der Table
	    getTableHeader().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent evt) {
					setRowSorter(sorter);	
	            	if(update)
	            	{
	                    JTableHeader    header = (JTableHeader) evt.getSource(); 
	                     int column = header.getColumnModel().getColumnIndexAtX(evt.getX()); 
	                     getTabellenModel().setSortedCol(column);
	                     for(int i=0;i<tModel.getRowCount();i++) 
	                     { 
	                      
	                        try 
	                        { 
	                        Long.parseLong(tModel.getValueAt(i,column).toString());
	                        getTabellenModel().setTypes("STRING");
	                        } 
	                        catch (Exception e) 
	                        { 
	                            try 
		                        { 
		                        Double.parseDouble(tModel.getValueAt(i,column).toString());
		                        getTabellenModel().setTypes("DOUBLE");
		                        } 
		                        catch (Exception e1) 
		                        { 
			                       getTabellenModel().setTypes("STRING");
			                       break;
		                        } 
	                        } 
	                        
	                       
	                     } 
	            	}
	            	else
	            	{
	            		update=true;
	            	}
	            	
		        }



Code:
//im model 


	  public void setTypes(String type)
	  {
		  sTypes=type;
	  }
	  
	  private int getSortedCol()
	  {
		  return sortedCol;
	  }
	  
	  public void setSortedCol(int sortedColumn)
	  {
		  sortedCol=sortedColumn;
	  }
	  
	  private String getTypes()
	  {
		  return sTypes;
	  }
	  
      public Class getColumnClass(final int columnIndex) 
      { 
    	  if(getSortedCol()==columnIndex)
    	  {

    		  if(getTypes().equals("DOUBLE"))
    		  {
    			  return types [1];  
    		  } 
    		  if(getTypes().equals("STRING"))
    		  {
    			  return types [2];  
    		  }

    	  }
    	  return types [2]; 
      }

bekomme immer diese Exception

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 org.jdesktop.swing.JXTable$DoubleRenderer.setValue(Unknown Source)
at javax.swing.table.DefaultTableCellRenderer.getTableCellRendererComponent(Unknown Source)
at javax.swing.JTable.prepareRenderer(Unknown Source)
at org.jdesktop.swing.JXTable.prepareRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCell(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)
 
Moin!
Die Änderungen die du am Anfang erwähnt hast, die durch das Sortieren passieren, kommen wohl dadurch zustande, so nehm ich jedenfalls an, das dein Sortierer die Zahlen vorher noch formatiert.
Warum gibst du denn nicht immer "String" als Columnclass zurück?
Wie gesagt, kenne ich deinen TableSorter nicht, aber es sollte ihm durch wurscht sein, was da denn genau drin steht.

Viel kann ich nicht dazu sagen, da ich JXTable und die ganzen anderen Komponenten nicht kenne, die du da nutzt...

*grüssle*
MeinerEiner
 
JXTable war nur ein versuch und erbt von JTable....

Ich benutze den ganz normalen TablerSorter von sun....
und wenn ich immer String zurückgebe dann meckert er in meinem getValueAt
dass er long nicht zu String casten kann okay dann habe ich es an der Stelle zu string gecastet was auch alles funktioniert... aber wenn ich dann zahlen z.B. 3,4,50,2,6,7
wird so sortiert 2,3,4,50,6,7
Hier der ursrüngliche Code ohne meiner Versuche ;)
Code:
//IM MODEL
		public Object getValueAt(int row, int col) {
			
			Object[] vRow=null;
			vRow =(Object[])oData[row];			
			
			return (vRow[col]!=null?vRow[col].toString():"" );

			
		}

Code:
hier in der jTable

            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; 
                  } 

               }

wie gesagt son sortiert der Tablesorte nur Strings und die Zahlen falsch
 
Hier meine Lösung

Code:
Sorter
public abstract class Sorter  {
    private boolean	ascending = true;
    private final int column;
    
    public Sorter() {
        this(0, true);
    }

    public Sorter(int col, boolean ascending) {
    	column=col;
        setAscending(ascending);
    }

    public int compare(int row1, int row2) {
        int result = compare(row1, row2, getColumnIndex());
        return ascending ? result : -result;
    }

    private int compare(int row1, int row2, int col) {
        Object o1 = getInputValue(row1, col);
        Object o2 = getInputValue(row2, col);

       
        if (o1 == null && o2 == null) {
            return 0;
        }
        else if (o1 == null) { 
            return -1;
        }
        else if (o2 == null) {
            return 1;
        }
        
        try
        {
        	Double.parseDouble(o1.toString());
        	Double.parseDouble(o2.toString());
        	o1= new Double(o1.toString());
        	o2= new Double(o2.toString());
        }
        catch(Exception e)
        {
        	
        }
        
        if (o1 instanceof Comparable) {
        	
        	if(o1 instanceof Double || o2 instanceof Double)
        	{
        		double dbl1= Double.parseDouble(o1.toString());
        		double dbl2= Double.parseDouble(o2.toString());
       		 if (dbl1 < dbl2) {
		         return -1;
			     } else if (dbl1 > dbl2) {
			         return 1;
			     } else {
			         return 0;
			     }
        	}
            Comparable c1 = (Comparable) o1;
            Comparable c2 = (Comparable) o2;
            return c1.compareTo(c2);
        }
        else if (o1 instanceof Boolean) {
            try {
                Boolean bool1 = (Boolean) o1;
                boolean b1 = bool1.booleanValue();
                Boolean bool2 = (Boolean) o2;
                boolean b2 = bool2.booleanValue();

                if (b1 == b2) {
                    return 0;
                }
                else if (b1) { // Define false < true
                    return 1;
                }
                else {
                    return -1;
                }
            }
            catch (ClassCastException ex) {
                System.out.println("Column class mismatch: " + o1.getClass() +
                                   " can't be compared to " + o2.getClass());
            }
        }
        else {
            return o1.toString().compareTo(o2.toString());
        }

        return 0;
    }

    public boolean isAscending() {
        return ascending;
    }

    public void setAscending(boolean ascending) {
        this.ascending = ascending;
        refresh();
    }

    public void toggle() {
        ascending = !ascending;
    }
    
    public int getColumnIndex() {
        return column;	
    }
    
    
}


Code:
public class MEDSorter extends Sorter {
    private int[]	toPrevious, fromPrevious;

    public MEDSorter () {
        this(0, true);
    }

    public MEDSorter (int col, boolean ascending) {
        super(col, ascending);
    }

    protected void init() {
        toPrevious = new int[0];
        fromPrevious = new int[0];
    }
 protected void sort(int from[], int to[], int low, int high) {
        for (int i = low; i < high; i++) {
            if (q >= high || (p < middle && compare(from[p], from[q]) <= 0)) {
                to[i] = from[p++];
            }
            else {
                to[i] = from[q++];
            }
}
 
Zuletzt bearbeitet:
Zurück