You can just have MyObject
implements Comparable
then compare the Time
objects in the compareTo
method. Something like
private class MyObject implements Comparable<MyObject> {
private Time time;
private String name;
public MyObject(String name, Time time) {
this.time = time;
this.name = name;
}
@Override
public int compareTo(MyObject o) {
return (this.getTime().compareTo(o.getTime()));
}
public Time getTime() {
return time;
}
@Override
public String toString() {
return name + " : " + time;
}
}
Then you can use Collections.sort
to sort the list. You will need to add the data from the DefaultlistModel
to a separate list, sort that list, remove the elements from the DefaultListModel
, then add the sorted elements back. Something like
private void sortModel(DefaultListModel model) {
List<MyObject> list = new ArrayList<>();
for (int i = 0; i < model.size(); i++) {
list.add((MyObject)model.get(i));
}
Collections.sort(list);
model.removeAllElements();
for (MyObject s : list) {
model.addElement(s);
}
}
Below you can see the complete example.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class TestListSort {
public TestListSort() {
JList list = createList();
JButton button = createButton(list);
JScrollPane scroll = new JScrollPane(list);
scroll.setPreferredSize(new Dimension(200, 150));
JFrame frame = new JFrame();
frame.add(scroll);
frame.add(button, BorderLayout.SOUTH);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public JButton createButton(final JList list) {
JButton button = new JButton("Sort");
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
DefaultListModel model = (DefaultListModel)list.getModel();
sortModel(model);
}
});
return button;
}
private void sortModel(DefaultListModel model) {
List<MyObject> list = new ArrayList<>();
for (int i = 0; i < model.size(); i++) {
list.add((MyObject)model.get(i));
}
Collections.sort(list);
model.removeAllElements();
for (MyObject s : list) {
model.addElement(s);
}
}
private JList createList() {
JList list = new JList(createModel());
return list;
}
private DefaultListModel createModel() {
Random random = new Random();
DefaultListModel model = new DefaultListModel();
for (int i = 0; i < 20; i++) {
long time = random.nextLong();
Time timeObj = new Time(time);
model.addElement(new MyObject("Object " + i, timeObj));
}
return model;
}
private class MyObject implements Comparable<MyObject> {
private Time time;
private String name;
public MyObject(String name, Time time) {
this.time = time;
this.name = name;
}
@Override
public int compareTo(MyObject o) {
return (this.getTime().compareTo(o.getTime()));
}
public Time getTime() {
return time;
}
@Override
public String toString() {
return name + " : " + time;
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new TestListSort();
}
});
}
}
UPDATE
Sorry but I don't get the exception. Below is the only thing I changed
private DefaultListModel createModel() {
Random random = new Random();
DefaultListModel model = new DefaultListModel();
for (int i = 0; i < 20; i++) {
long horaInicio = random.nextLong();
long horaTermino = random.nextLong();
Time timeInicio = new Time(horaInicio);
Time timeTermino = new Time(horaTermino);
Paciente paciente = new Paciente("Paciente " + i);
Cita cita = new Cita(i, "blah", timeInicio, timeTermino, paciente,
"blah", "blah", "blah", "blah", "blah");
model.addElement(cita);
}
return model;
}
......
private void sortModel(DefaultListModel model) {
List<Cita> list = new ArrayList<>();
for (int i = 0; i < model.size(); i++) {
list.add((Cita) model.get(i));
}
Collections.sort(list);
model.removeAllElements();
for (Cita s : list) {
model.addElement(s);
}
}
And I added my own Paciente
class to get rid of the uncompilable code
class Paciente {
private String nombre;
public Paciente(String nombre) {
this.nombre = nombre;
}
public String getNombre() {
return nombre;
}
}