So, das Osterwochenende neigt sich dem Ende entgegen, und ich habe einiges gelernt. Für mein Lernbeispiel habe ich mit noch eine Klasse zum Sortieren von Tables ("Beispiel aus Core Java 2" angetan. Ich gebe zu, dass ist im Moment noch zu hoch für micht. Anyway, kommt Zeit kommt ... .
Trotzdem hätte ich es gerne gehabt, dass es funktioniert. Aber leider tut es das nicht. Der folgende Source läßt sich fehlerfrei compilieren und der MouseListener habe ich auch getestet. Dieser reagiert auch noch. Nur leider werden die Werte nicht sortiert.
Ich denke nicht, dass es an der Klasse SortFilterModel liegt, denn diese funktioniert im Beispiel des Buches wunderbar. Da ich es noch nicht verstanden habe, habe ich diese Klasse bestimmt nicht richtig implementiert! :roll:
Ich habe mal versucht rauszufinden, was passiert. Nach dem MouseEvent läuft er in die Klasse rein. Nur leider gibt es da keine Werte zum sortieren!
Deshalb poste ich mal den gesamten Code. Vielleicht kann ein anderes Forum-Mitglied (newbee wie ich) mit dem Beispiel ja auch etwas anfangen.
Trotzdem hätte ich es gerne gehabt, dass es funktioniert. Aber leider tut es das nicht. Der folgende Source läßt sich fehlerfrei compilieren und der MouseListener habe ich auch getestet. Dieser reagiert auch noch. Nur leider werden die Werte nicht sortiert.
Ich denke nicht, dass es an der Klasse SortFilterModel liegt, denn diese funktioniert im Beispiel des Buches wunderbar. Da ich es noch nicht verstanden habe, habe ich diese Klasse bestimmt nicht richtig implementiert! :roll:
Ich habe mal versucht rauszufinden, was passiert. Nach dem MouseEvent läuft er in die Klasse rein. Nur leider gibt es da keine Werte zum sortieren!
Deshalb poste ich mal den gesamten Code. Vielleicht kann ein anderes Forum-Mitglied (newbee wie ich) mit dem Beispiel ja auch etwas anfangen.
Code:
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class TestArray extends JFrame implements ActionListener{
private int arrListeCount = 0;
private int swierg;
private String tmperg = null;
JMenuItem item, quit;
String[][] arrListe = new String[0][5];
final String[] columnNames = {"Geburtsdatum","Vorname","Nachname","Telefon","Mobil"};
final String[] abc = {"A","B","C","D","E","F","G","H","I","J","K","L","M",
"N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
JButton showBirthday = new JButton("Geburtstage");
GregorianCalendar makeCalendar = new GregorianCalendar();
DefaultTableModel model = new DefaultTableModel (arrListe, columnNames);
SorterFilterModel sorter = new SorterFilterModel(model);
final JTable table = new JTable(sorter);
public TestArray (){
JScrollPane scrollPane = new JScrollPane ();
scrollPane.setViewportView(table);
setSize(640, 480);
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel pane = new JPanel();
pane.setLayout(new BorderLayout());
showBirthday.addActionListener(this);
JPanel butpanel = new JPanel( new GridLayout( abc.length, 1 ) );
JMenuBar mbar = new JMenuBar();
JMenu fileMenu = new JMenu("Datei");
mbar.add(fileMenu);
quit = new JMenuItem("Beenden");
quit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
quit();
}});
fileMenu.add(quit);
for( int i = 0; i < abc.length; i++ ){
JButton button = new JButton( abc[i] );
button.setActionCommand( abc[i] );
button.addActionListener( this );
butpanel.add( button );
}
pane.add( "West", butpanel );
pane.add("Center", scrollPane);
pane.add("South", showBirthday);
pane.add("North", mbar);
setContentPane(pane);
sorter.addMouseListener(table);
}
public void birthdayTable(){
loadFile();
table.setModel( new DefaultTableModel( arrListe, columnNames ) );
for ( int i= 0; i < arrListeCount; i++){
model.addRow(arrListe[i]);
}
}
// Methode für die Ermittlung des aktuellen Monats
public String makeMonth() {
String month = null;
int m = makeCalendar.get(Calendar.MONTH) + 1;
if ( m < 10) {
month = "0" + String.valueOf(m);
} else {
month = String.valueOf(m);
}
return month;
}
public void loadFile(){
try {
FileReader file = new FileReader("birthday.csv");
BufferedReader buff = new BufferedReader(file);
LinkedList list = new LinkedList();
boolean eof = false;
int count = 0;
String compMonth = makeMonth();
while(!eof) {
String line = buff.readLine();
if (line == null)
eof = true;
else {
StringTokenizer tokenizer = new StringTokenizer( line, ";" );
int size = tokenizer.countTokens();
String[] array = new String[size];
int index = 0;
while( index < size ) {
array[index] = tokenizer.nextToken();
index++;
}
// Füllen der Ergebnisliste
switch(swierg){
case 0: // Nach Anfangsbuchstaben
if (array[2].substring(0,1).toUpperCase() .equals(tmperg))
list.addLast( array );
break;
case 99: // Nach Geburtstagsmonat
if (array[0].substring(3,5) .equals(compMonth))
list.addLast( array );
break;
}
arrListeCount = list.size();
arrListe = (String[][])list.toArray( new String[arrListeCount][] );
}
}
buff.close();
} catch (IOException e){
System.out.println("Error-- " + e.toString());
}
}
public void actionPerformed(ActionEvent evt){
Object source = evt.getSource();
if (source == showBirthday) {
swierg = 99;
birthdayTable();
} else {
swierg = 0;
tmperg = evt.getActionCommand();
birthdayTable();
}
}
public void quit() {
System.exit(0);
}
public static void main(String[] args) {
Frame f = new TestArray();
f.show();
}
}
class SorterFilterModel extends AbstractTableModel{
public SorterFilterModel(TableModel m){
model = m;
rows = new Row[model.getRowCount()];
for (int i=0; i < rows.length; i++){
rows[i] = new Row();
rows[i].index = i;
}
}
public void sort(int c){
sortColumn = c;
Arrays.sort(rows);
fireTableDataChanged();
}
public void addMouseListener(final JTable table){
table.getTableHeader().addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent event){
if(event.getClickCount() < 2) return;
int tableColumn = table.columnAtPoint(event.getPoint());
int modelColumn = table.convertColumnIndexToModel(tableColumn);
sort(modelColumn);
}
});
}
public Object getValueAt(int r, int c){
return model.getValueAt(rows[r].index, c);
}
public void setValueAt(Object aValue, int r, int c){
model.setValueAt(aValue, rows[r].index, c);
}
public int getColumnCount() {
return model.getColumnCount();
}
public int getRowCount() {
return model.getRowCount();
}
public String getColumnName(int c) {
return model.getColumnName(c);
}
public Class getColumnClass(int c) {
return model.getColumnClass(c);
}
private class Row implements Comparable {
public int index;
public int compareTo(Object other){
Row otherRow = (Row)other;
Object a = model.getValueAt(index, sortColumn);
Object b = model.getValueAt(otherRow.index, sortColumn);
if(a instanceof Comparable)
return((Comparable)a).compareTo(b);
else
return index - otherRow.index;
}
}
private TableModel model;
private int sortColumn;
private Row[] rows;
}