Hallo,
ich habe ein Problem mit einer JTable, die ich gerne sortieren möchte. Es geht darum, dass ich eine Spalte habe, in der nur Calendar Objekte sind. Ich möchte die Tabelle nach der Zeit, also nach der Calendar-Spalte sortieren.
Allerdings geht die Sortierung total durcheinander - und ich kann kein Muster erkennen, nach dem die Sortierung falsch läuft.
Ich komme dem Problem nicht auf die Schliche - deshalb habe ich nun den entsprechenden Code mal aus meinem Programm extrahiert, damit nur das Nötigste drin steht. Der folgende Code macht eigentlich nichts anderes, als ein Fenster erstellen, eine Tabelle mit 3 Spalten erstellen, der Tabelle ein paar Einträge hinzufügen und dann zu versuchen, diese nach der 2. Spalte (der Zeit) zu sortieren:
(Das Programm sollte so lauffähig sein - einfach in eine entsprechende Java Datei kopieren, kompilieren und starten)
Das merkwürdige ist, dass die Sortierung nach dem Start des Programmes korrekt ist. Macht man aber ein Doppelklick in eine Zelle der 1. Spalte und trägt irgendwas ein, z.B. "123", so verändert sich die Sortierung plötzlich. Trägt man nacheinander in allen Zellen der 1. Spalte was ein, so endet die "Sortierung" so, dass nichts mehr sortiert ist. Und das ganze, obwohl ich doch eigentlich nur nach der Zeit Spalte sortiere (siehe TableRowSorter oben im Code).
Ich würde mich wirklich freuen, wenn mich jemand mal über dieses Verhalten der Tabelle aufklären könnte. Denn das wird auch die Antwort darauf sein, warum die Sortierung in meinem "richtigen" Programm so falsch läuft.
Vielen Dank für Eure Hilfe!
ich habe ein Problem mit einer JTable, die ich gerne sortieren möchte. Es geht darum, dass ich eine Spalte habe, in der nur Calendar Objekte sind. Ich möchte die Tabelle nach der Zeit, also nach der Calendar-Spalte sortieren.
Allerdings geht die Sortierung total durcheinander - und ich kann kein Muster erkennen, nach dem die Sortierung falsch läuft.
Ich komme dem Problem nicht auf die Schliche - deshalb habe ich nun den entsprechenden Code mal aus meinem Programm extrahiert, damit nur das Nötigste drin steht. Der folgende Code macht eigentlich nichts anderes, als ein Fenster erstellen, eine Tabelle mit 3 Spalten erstellen, der Tabelle ein paar Einträge hinzufügen und dann zu versuchen, diese nach der 2. Spalte (der Zeit) zu sortieren:
Code:
import java.awt.Component;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.swing.*;
import javax.swing.RowSorter.SortKey;
import javax.swing.table.*;
public class TableSortingTest
{
@SuppressWarnings( "serial" )
private class MyTableCellRenderer extends DefaultTableCellRenderer
{
@Override
public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column )
{
JLabel c = (JLabel)super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
if ( value instanceof Calendar )
{
SimpleDateFormat df = new SimpleDateFormat( "dd.MM.yyyy HH:mm" );
c.setText( df.format( ( (Calendar)value ).getTime() ) );
}
return c;
}
};
private static final int COLUMN_DATA = 0;
private static final int COLUMN_TIME = 1;
private static final int COLUMN_VALUE = 2;
public TableSortingTest()
{
// Create window
JFrame frame = new JFrame( "Table Sorting Test" );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setSize( 640, 480 );
frame.setLocationRelativeTo( null );
// Create table component
JTable table = new JTable();
table.setDefaultRenderer( Object.class, new MyTableCellRenderer() );
DefaultTableModel model = new DefaultTableModel( 0, 3 );
table.setModel( model );
TableColumnModel columnModel = table.getColumnModel();
columnModel.getColumn( COLUMN_DATA ).setHeaderValue( "Data" );
columnModel.getColumn( COLUMN_TIME ).setHeaderValue( "Zeit" );
columnModel.getColumn( COLUMN_VALUE ).setHeaderValue( "Wert" );
// Create calendar objects for the time column
Calendar time1 = Calendar.getInstance();
Calendar time2 = Calendar.getInstance();
Calendar time3 = Calendar.getInstance();
Calendar time4 = Calendar.getInstance();
Calendar time5 = Calendar.getInstance();
// Set different times
time1.set( 2008, 4, 22, 15, 54);
time2.set( 2008, 4, 22, 15, 57);
time3.set( 1007, 4, 22, 15, 58);
time4.set( 1006, 4, 22, 15, 56);
time5.set( 1999, 4, 22, 16, 00);
// Add rows to the table model
model.addRow( new Object[] { null, time1, "Zeit 1" } );
model.addRow( new Object[] { null, time2, "Zeit 2" } );
model.addRow( new Object[] { null, time3, "Zeit 3" } );
model.addRow( new Object[] { null, time4, "Zeit 4" } );
model.addRow( new Object[] { null, time5, "Zeit 5" } );
// Create table row sorter
TableRowSorter< TableModel > sorter = new TableRowSorter< TableModel >( table.getModel() );
sorter.setSortsOnUpdates( true );
// Create the sort keys
List< SortKey > sortKeys = new ArrayList< SortKey >();
sortKeys.add( new SortKey( COLUMN_TIME, SortOrder.ASCENDING ) );
sorter.setSortKeys( sortKeys );
table.setRowSorter( sorter );
frame.add( table );
frame.setVisible( true );
}
public static void main( String[] args )
{
new TableSortingTest();
}
}
(Das Programm sollte so lauffähig sein - einfach in eine entsprechende Java Datei kopieren, kompilieren und starten)
Das merkwürdige ist, dass die Sortierung nach dem Start des Programmes korrekt ist. Macht man aber ein Doppelklick in eine Zelle der 1. Spalte und trägt irgendwas ein, z.B. "123", so verändert sich die Sortierung plötzlich. Trägt man nacheinander in allen Zellen der 1. Spalte was ein, so endet die "Sortierung" so, dass nichts mehr sortiert ist. Und das ganze, obwohl ich doch eigentlich nur nach der Zeit Spalte sortiere (siehe TableRowSorter oben im Code).
Ich würde mich wirklich freuen, wenn mich jemand mal über dieses Verhalten der Tabelle aufklären könnte. Denn das wird auch die Antwort darauf sein, warum die Sortierung in meinem "richtigen" Programm so falsch läuft.
Vielen Dank für Eure Hilfe!