2015-12-10 4 views
0

Я работаю с JTable Это может отображать некоторые данные, отсортированные по последним двум столбцам. Проблема состоит в том, что последние две колонки заполнены строками, одна из которых - Дни слабых (с понедельника по пятницу), остальные - часы (HH: мм), я хотел бы отсортировать их с понедельника по пятницу, и если есть больше элементов того же Дня, которые они должны сортировать по Erliest Hour. До сих пор google не очень помогала, так как в нем есть только способы отсортировать что-то в алфавитном порядке в порядке Ascendant/descendant для чисел, но мне не нужен по алфавиту JTable. У кого-нибудь есть идея?Сортировка содержимого JTable

public class ScheduleFrame extends JFrame { 

private JPanel contentPane; 
private static JTable table; 


public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       ScheduleFrame frame = new ScheduleFrame(); 
       frame.setVisible(true); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
* @throws Exception 
*/ 
public ScheduleFrame(){ 
    setTitle("Schedule"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 627, 405); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    contentPane.setLayout(new BorderLayout(0, 0)); 
    setContentPane(contentPane); 
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 


    JScrollPane scrollPane = new JScrollPane(); 
    contentPane.add(scrollPane, BorderLayout.CENTER); 

    table = new JTable(); 
    scrollPane.setViewportView(table); 
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    table.setModel(new DefaultTableModel(
     new Object[][] { 
     }, 
     new String[] { 
      "Course Name", "Course Room","Course Day", "Course Hour" 
     } 
    ));} 



    public static void loadTable()throws Exception{ 
     DefaultTableModel tm = (DefaultTableModel) table.getModel(); 
     BufferedReader bfw = new BufferedReader(new FileReader("Schedulecourses.txt")); 
     String line; 
     while((line = bfw.readLine()) != null) { 
     tm.addRow(line.split("\t")); 
     } 
      bfw.close(); 
     } 
} 

Вот как это schould выглядеть

http://i.stack.imgur.com/vcgNY.png

ответ

0

Просто реализовать его самостоятельно. Используйте некоторые базовые алгоритм сортировки, как и быстрой сортировки, пузырьковой сортировки или сортировка слиянием (как найти на википедии), и создать свою собственную функцию сравнения, чтобы поместить записи в порядке, как в псевдокоде:

bool is_smaller(entry_1, entry_2){ 
    if (entry_1.weekday < entry_2.weekday) return true; 
    if (entry_1.weekday > entry_2.weekday) return false; 
    if (entry_1.course hour < entry_2.course_hour) return true; 
    if (entry_1.course hour > entry_2.course_hour) return false; 
    return false; 
} 

(из курс с другой функцией сравнения для буднего дня и часа курса)

0

Я предлагаю вам попробовать и отобразить данные, которые вы читаете из файла, на какой-то объект модели, который впоследствии можно отсортировать. Например:

public class Course implements Comparable<Course> { 

    private String name; 
    private String room; 
    private String day; 
    private String hour; 

    // constructor and getters are omitted. you can add setters as well, but it's best that you keep this class immutable 

    @Override 
    public int compareTo(Course course) { 
     // here you implement the logic of your comparison 
    } 
} 

Преимущество здесь в том, что, реализуя интерфейс Comparable<T> предоставленный API Java, необходимо указать, что экземпляры вашего Course класса имеют естественный порядок. Затем вы можете использовать Collections.sort(), и ваш список курсов будет автоматически отсортирован по вашему желанию. Затем вы можете использовать его для поддержки своей модели таблицы и отображения ее в таблице.

Edit 1: Немного разъяснений по моему предложению:

Сейчас вы читаете текстовые данные из файла, преобразование каждой строки в массив строк и передать его в DefaultTableModel, который поставляет данные к вашему JTable.

Вместо этого вы можете немного усложнить код, но в конечном итоге получите лучшее решение с архитектурной точки зрения. Какие шаги:

  • Определение класса модели (например, в классе пример Course), который будет содержать данные, которые сохранены в текстовом файле. Реализовать логику для преобразования каждой строки файла в экземпляр класса Course. Эти экземпляры будут представлять ваши данные, и вы будете использовать их для заполнения таблицы данными.
  • Внесите свой собственный TableModel, который содержит отсортированный список экземпляров Course (это те экземпляры, которые вы читаете из файла). Используйте реализованную модель для передачи данных на ваш JTable.
+0

Привет, Данаил, во-первых, спасибо за ответ. Я попытался бы реализовать ваше предложение, но я не полностью понял, что вы имеете в виду, можете ли вы добавить некоторые детали к вашему предложению? это действительно помогло бы :) – Erry07

+0

Привет, я попытался добавить немного большей ясности в ответ. Проверьте изменения. Надеюсь, теперь это легче понять. –

1

один из них Дни слабой (понедельник-пятница)

Таким образом, данные в TableModel могли быть сохранены в виде целого числа, чтобы представить день недели. Затем вы используете собственный рендерер для преобразования значения Integer в описательное значение.

Прочтите раздел из учебника Swing на примере Using Custom Renderers.

В вашем случае код в методе setValue(...) будет что-то вроде:

int dayOfWeek = (Integer)value; 

switch (dayOfWeek) 
{ 
    case 1: setText("Monday"); break; 
    case 2: setText("Tuesday"); break; 
    case 3: ... 
    default: value.toString(); 
} 

остальных часы (чч: мм),

В этом случае вы хранящие два части информации. Таким образом, это означает, что вам нужно проанализировать данные в два раза, а затем создать собственный сортировщик для сортировки в зависимости от первого раза.

Другим вариантом может быть создание двух столбцов: «Время начала», «Время окончания». Затем вы можете хранить объекты Date в TableModel, а затем просто использовать Компаратор по умолчанию, который будет сортировать по дате.

Смежные вопросы