Hallo,
hab hier ein kleines Problem mit einer JList und kämpfe nun schon seit Stunden wenigstens zu verstehen wo die Ursache des Problems ist.
Hier erstmal der Code:
Wie man sieht hab ich eine JList mit einem DefaultListModel. Das listModel wird mit der ClassKontakt gefüllt. ClassKontakt besteht aus einer Id und einem Namen.
Jetzt wollte ich erreichen, dass wenn man auf den button klickt die Liste nach den Namen sortiert wird. Dazu verwende ich einen Comperator. Das klappt auch wunderbar.
Nun zu meinem Problem, wenn ich auf die jListe klicke und einmal mit dem Tastatur-Pfeil nach unten klicke, dann wird die jList sehr schnell sortiert.
Wenn ich jedoch sofort sortiere dauert es sehr lange.
Kann mir dieses verhalten vielleicht jemand erklären? Bin schon am verzweifeln.
hab hier ein kleines Problem mit einer JList und kämpfe nun schon seit Stunden wenigstens zu verstehen wo die Ursache des Problems ist.
Hier erstmal der Code:
Java:
package test;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JList;
public class TestFrame extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JButton jButton = null;
private JScrollPane jScrollPane = null;
private JList jList = null;
private DefaultListModel listModel = new DefaultListModel();
private List<ClassKontakt> data = new ArrayList<ClassKontakt>();
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setText("Sortiere nach Namen");
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
Comparator<ClassKontakt> comp = new ComparatorKontakt();
Collections.sort(data, comp);
listModel.clear();
for (int i = 0; i < data.size(); i++) {
listModel.addElement(data.get(i));
System.out.println("###################################################"+i);
}
}
});
}
return jButton;
}
private JScrollPane getJScrollPane() {
if (jScrollPane == null) {
jScrollPane = new JScrollPane();
jScrollPane.setViewportView(getJList());
}
return jScrollPane;
}
private JList getJList() {
if (jList == null) {
jList = new JList();
jList.setModel(listModel);
for (int i = 0; i < data.size(); i++) {
listModel.addElement(data.get(i));
}
}
return jList;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TestFrame thisClass = new TestFrame();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}
public TestFrame() {
super();
for (int i = 0; i < 10000; i++) {
data.add(new ClassKontakt(i, "Name" + i));
}
initialize();
jList.setSelectedIndex(0);
}
private void initialize() {
this.setSize(300, 200);
this.setContentPane(getJContentPane());
this.setTitle("Listen Beispiel");
this.pack();
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getJButton(), BorderLayout.NORTH);
jContentPane.add(getJScrollPane(), BorderLayout.CENTER);
}
return jContentPane;
}
}
class ClassKontakt {
private final int id;
private final String name;
public ClassKontakt(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String toString() {
return id + " " + name;
}
}
class ComparatorKontakt implements Comparator<ClassKontakt> {
public int compare(ClassKontakt classKontakt1, ClassKontakt classKontakt2) {
if (classKontakt1 == null && classKontakt2 != null) {
return -1;
} else if (classKontakt1 != null && classKontakt2 == null) {
return 1;
} else if (classKontakt1 == null && classKontakt2 == null) {
return 0;
}
int result = 0;
Collator collator = null;
collator = Collator.getInstance(java.util.Locale.GERMAN);
collator.setStrength(Collator.SECONDARY);
result = collator.compare(classKontakt1.getName(), classKontakt2.getName());
if (result != 0) {
return result;
}
if (classKontakt1.getId() == classKontakt2.getId()) {
return 0;
} else if (classKontakt1.getId() > classKontakt2.getId()) {
return 1;
} else {
return -1;
}
}
}
Wie man sieht hab ich eine JList mit einem DefaultListModel. Das listModel wird mit der ClassKontakt gefüllt. ClassKontakt besteht aus einer Id und einem Namen.
Jetzt wollte ich erreichen, dass wenn man auf den button klickt die Liste nach den Namen sortiert wird. Dazu verwende ich einen Comperator. Das klappt auch wunderbar.
Nun zu meinem Problem, wenn ich auf die jListe klicke und einmal mit dem Tastatur-Pfeil nach unten klicke, dann wird die jList sehr schnell sortiert.
Wenn ich jedoch sofort sortiere dauert es sehr lange.
Kann mir dieses verhalten vielleicht jemand erklären? Bin schon am verzweifeln.