2012-05-06 1 views
1

JTable私はtable.setAutoCreateRowSorter(true);と設定しました。私の主な目的は、列の並べ替え順序にかかわらず、一番上に常にある行を持つことです。私がやった最初のことは、 "それ以外のもの"を意味するフラグを理解して、その項目を常に先頭にソートするように、セルデータ型のcompareToメソッドを変更することでした。残念なことに、これにより、列のソート順に応じて、指定された行が常に最上位に表示されるようになりました。のようになりました。したがって、並べ替え順序がである場合、の値が有効な値が,になるようにセルを設定する必要があります。私は列の並べ替え順序を取得する方法を見つけることができませんのみ問題です。 this pagesetAutoCreateRowSorter(true)を使用しているときに列のソート順を取得しますか?

、1つの提案答えは

残念ながら
if (myTable.getRowSorter().getSortKeys().get(column).getSortOrder == SortOrder.ASCENDING) { 
    ... 
} 

のラインに沿って、常に getSortKeys()は空のリストを返します。だから私は正方形に戻ってきた。 RowSorterListenerを追加することも考えましたが、並べ替え順序が変更されたときではなく、並べ替えが変更されたときのリスナーに見えます。

助けが必要ですか?ありがとう!

編集:ここに私の問題の一部を示すコードです。 System.out.printlnに注意してください。結果は常にゼロです。私は列の行の並べ替え順序を取得したいと思いますが、存在しないようです。

package tablecolumn; 

import java.awt.Dimension; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import javax.swing.GroupLayout; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.RowSorter; 
import javax.swing.SortOrder; 
import javax.swing.table.AbstractTableModel; 

public class Tablecolumn extends JFrame { 
    JScrollPane scroll; 
    JTable table; 
    MyTableModel model; 

    static String[] columnnames = new String[] {"A", "B", "C"}; 

    public class MyTableModel extends AbstractTableModel { 
     public List<List<String>> entries; 

     MyTableModel() { 
      entries = new ArrayList<List<String>>(); 
      for (int i=0; i<5; i++) { 
       List<String> cols = new ArrayList<String>(); 
       cols.add("X" + i); 
       cols.add("Y" + i); 
       cols.add("Z" + i); 
       entries.add(cols); 
      } 
     } 

     @Override 
     public int getRowCount() { 
      return entries.size(); 
     } 

     @Override 
     public int getColumnCount() { 
      return columnnames.length; 
     } 

     @Override 
     public Object getValueAt(int r, int c) { 
      List<? extends RowSorter.SortKey> rsk = table.getRowSorter().getSortKeys(); 
      System.out.println(rsk.size()); 
      return entries.get(r).get(c); 
     } 

     @Override 
     public Class getColumnClass(int c) { 
      return String.class; 
     } 

     @Override 
     public String getColumnName(int c) { return columnnames[c]; }   

     @Override 
     public boolean isCellEditable(int row, int col) { return false; } 

    } 

    public Tablecolumn() { 
     scroll = new JScrollPane(); 
     model = new MyTableModel(); 
     table = new JTable(); 

     table.setModel(model); 
     table.setAutoCreateRowSorter(true); 
     table.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS); 
     table.getTableHeader().setReorderingAllowed(false); 
     table.setColumnSelectionAllowed(false); 
     table.setRowSelectionAllowed(true); 

     scroll.setViewportView(table); 

     scroll.setMinimumSize(new Dimension(200, 200)); 
     scroll.setPreferredSize(new Dimension(800, 600)); 

     GroupLayout layout2 = new GroupLayout(this.getContentPane()); 
     this.setLayout(layout2); 
     layout2.setVerticalGroup(
      layout2.createSequentialGroup() 
       .addComponent(scroll) 
     ); 
     layout2.setHorizontalGroup(
      layout2.createParallelGroup() 
       .addComponent(scroll) 
     );    

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     pack(); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Tablecolumn().setVisible(true); 
      } 
     }); 
    } 
} 

答えて

0

table.setAutoCreateRowSorter(true);を使用すると、myTable.getRowSorter().getSortKeys()は常に空のリストを返すバグがあると思います。一方、あなた自身の行ソーターを追加すると、それは動作します。

私はこのコードを追加する必要:

RowSorter<MyTableModel> sorter = 
    new TableRowSorter<MyTableModel>(model); 
table.setRowSorter(sorter); 

さて、getSortKeys()は列とそのソート順のリストを返します。そのリストはあなたがクリックした列に応じて可変長ですので、myTable.getRowSorter().getSortKeys().get(index).getColumn()myTable.getRowSorter().getSortKeys().get(index).getSortOrder()を見てリストを反復しなければなりません。後者はSortOrder.ASCENDINGまたはSortOrder.DESCENDINGの値を含みます。

2

1)あなたの質問は、あなたが無視するのでrepeatly、unanswerableシンプルで編集だろう瞬間に)

import java.awt.*; 
import java.awt.event.*; 
import java.util.Arrays; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.*; 
import javax.swing.table.*; 
import javax.swing.RowSorter.SortKey; 

class SelectedColumnTest { 

    private JTableHeader header; 
    private Object selectedColumn = null; 
    private String[] columnNames = {"String", "Integer", "Boolean"}; 
    private Object[][] data = {{"aaa", 12, true}, {"bbb", 5, false}, {"CCC", 92, true}}; 
    private TableModel model = new DefaultTableModel(data, columnNames) { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Class<?> getColumnClass(int column) { 
      return getValueAt(0, column).getClass(); 
     } 
    }; 
    private JTable table = new JTable(model); 

    public JComponent makeUI() { 
     table.setRowSorter(new TableRowSorter<TableModel>(model) { 

      @Override 
      public void toggleSortOrder(int column) { 
      } 
     }); 
     header = table.getTableHeader(); 
     header.getActionMap().put("toggleSortOrder2", new AbstractAction() { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       e.setSource(table); 
       table.getActionMap().get("focusHeader").actionPerformed(e); 
       if (selectedColumn != null) { 
        int i = header.getColumnModel().getColumnIndex(selectedColumn); 
        SortOrder order = SortOrder.ASCENDING; 
        List<SortKey> keys = new ArrayList<SortKey>(table.getRowSorter().getSortKeys()); 
        if (!keys.isEmpty()) { 
         SortKey sortKey = keys.get(0); 
         if (sortKey.getColumn() == i && sortKey.getSortOrder() == SortOrder.ASCENDING) { 
          order = SortOrder.DESCENDING; 
         } 
        } 
        table.getRowSorter().setSortKeys(Arrays.asList(new SortKey(i, order))); 
       } 
       header.repaint(); 
      } 
     }); 
     InputMap im = header.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
     im.put(KeyStroke.getKeyStroke(KeyEvent.VK_F8, 0), "toggleSortOrder2"); 
     header.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseClicked(MouseEvent e) { 
       JTableHeader h = (JTableHeader) e.getSource(); 
       int i = h.columnAtPoint(e.getPoint()); 
       Object o = h.getColumnModel().getColumn(i).getHeaderValue(); 
       if (i < 0 || o == selectedColumn) { 
        selectedColumn = null; 
        return; 
       } 
       selectedColumn = o; 
       h.requestFocusInWindow(); 
      } 
     }); 
     final TableCellRenderer hr = table.getTableHeader().getDefaultRenderer(); 
     header.setDefaultRenderer(new TableCellRenderer() { 

      @Override 
      public Component getTableCellRendererComponent(JTable t, Object v, 
        boolean isS, boolean hasF, int row, int col) { 
       return (v == selectedColumn) ? hr.getTableCellRendererComponent(
         t, v, true, true, row, col) : hr.getTableCellRendererComponent(
         t, v, false, false, row, col); 
      } 
     }); 
     header.setToolTipText("Sorting by F8"); 
     JPanel p = new JPanel(new BorderLayout()); 
     p.add(new JScrollPane(table)); 
     return p; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    public static void createAndShowGUI() { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new SelectedColumnTest().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 

3など)SSCCE

2を掲示を要求するあなたのSSCCEの質問に正確にあなたの問題が示されたら、私はそれを見てみましょう

4)それ以外は何もありません。Darryl's Multisort Table Header Cell Renderer

+0

問題が発生していることを示すコードを追加しましたが、行を先頭に保持するためのソリューションは含まれていません。 –

関連する問題