2013-08-13 2 views
2

Java SE 6 Стрелки для ASC/DESC выше заголовок-Text (это должен быть заказчиком)TableRowSorter использование LookAndFeel из TableHeader, но собственный компаратор

Я использую, чтобы показать стрелки выше заголовок текста:

TableRowSorter sorter = new TableRowSorter(); 
sorter.setModel(table.getModel()); 
table.setRowSorter(sorter); 

или

table.setAutoCreateRowSorter(true); 

Стрелки для ASC/DESC выше заголовка-Text, это правильно. Я хочу использовать свой собственный компаратор, но в моем примере вызывается компаратор, но он не работает. Какой код нужно изменить для сортировки таблицы-строк моим собственным компаратором со стрелками над сортировкой заголовка-заголовка asc/desc?

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Vector; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableRowSorter; 

import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class JTableExample extends JFrame { 

    private JTable table; 

    private FooTableModel model; 

    public JTableExample() { 
     super("JTableExample"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
      String plaf = UIManager.getSystemLookAndFeelClassName(); 
      try { 
       UIManager.setLookAndFeel(plaf); 
      } 
      catch (ClassNotFoundException e) {} 
      catch (InstantiationException e) {} 
      catch (IllegalAccessException e) {} 
      catch (UnsupportedLookAndFeelException e) {} 
      SwingUtilities.updateComponentTreeUI(this); 

     Object[][] rowData = { { "a", "c" }, { "b", "b" }, { "c", "a" } }; 
     Object[] columnHeaders = { "Header1", "Header2" }; 
     model = new FooTableModel(rowData, columnHeaders); 

     table = new JTable(model); 
     table.setAutoCreateRowSorter(true); 

     table.getTableHeader().addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent evt) { 
       model.sortByColumn(table.columnAtPoint(evt.getPoint())); 
      } 
     }); 

     Container c = getContentPane(); 
     c.add(new JScrollPane(table), BorderLayout.CENTER); 

     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new JTableExample(); 
    } 

    class FooTableModel extends DefaultTableModel { 
     public FooTableModel(Object[][] rowData, Object[] headers) { 
      super(rowData, headers); 
     } 

     public void sortByColumn(final int clm) { 
      Collections.sort(this.dataVector, new Comparator() { 
       public int compare(Object o1, Object o2) { 
        Vector v1 = (Vector) o1; 
        Vector v2 = (Vector) o2; 


        String s1 = (String) v1.get(clm); 
        String s2 = (String) v2.get(clm); 

        return s1.compareTo(s2); 
       } 
      }); 
     } 
    } 
} 

ответ

2

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

Пользовательские компараторы (в колонке) настраиваются в RowSorter, что-то вроде:

table.setAutoCreateRowSorter(true); 
((TableRowSorter) table.getRowSorter()).setComparator(columnIndex, myComparator); 

BTW: расположение значка сортировки контролируется LAF, не так много вы можете сделать, чтобы изменить это (короткий написания пользовательского LAF)

+0

не может видеть diff (Win8/Java7), все работает, с пользовательским компаратором или нет, вопрос, если действительно нужен, как раз, просто переместите L & F в начало основного класса – mKorbel

+0

@mKorbel мой обычный вопрос: что вы имеете в виду? – kleopatra

+0

Сортировка Значки видны (после того, как L & F переместится из контруктора в нужное место в основной класс), затем работают сортировщики, и значки видны в JTableHeader (код OPs, размещенный здесь), similair/или если я перепробовал sorter.setComparator (int, new Компаратор () {... – mKorbel