2010-06-16 56 views
2

我想通過在程序中向外部提供列索引來實現對JTable的排序。這裏是我的示例代碼,其中我已初始化JTable,向JTable添加一列和30行。添加行後,我通過提供列索引0排序JTable,但我無法獲得排序數據。我怎樣才能以排序順序得到我的第一列?我的代碼有什麼問題。爲什麼sortCTableonColumnIndex()方法無法爲指定列索引排序數據?如何通過在外部提供列索引來對JTable進行排序

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JDialog; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.RowSorter; 
import javax.swing.SortOrder; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.JTableHeader; 
import javax.swing.table.TableColumn; 
import javax.swing.table.TableRowSorter; 

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
/** 
* 
* @author Admin 
*/ 
public class Test { 

    private JTable oCTable; 
    private DefaultTableModel oDefaultTableModel; 
    private JScrollPane oPane; 
    private JTableHeader oTableHeader; 
    private TableRowSorter sorter; 

    public void adddata() { 
     for (int i = 0; i < 30; i++) { 
      Object[] row = new Object[1]; 
      String sValueA = "A"; 
      String sValueB = "A"; 
      row[0] = ""; 
      if (i % 2 == 0) { 
       if (i < 15) { 
        sValueA = sValueA + sValueA; 
        row[1] = sValueA; 
       } else { 
        if (i == 16) { 
         sValueB = "D"; 
         row[1] = sValueA; 
        } else { 
         sValueB = sValueB + sValueB; 
         row[1] = sValueA; 
        } 

       } 
      } else { 
       if (i < 15) { 
        sValueB = sValueB + sValueB; 
        row[1] = sValueB; 
       } else { 
        if (i == 17) { 
         sValueB = "C"; 
         row[1] = sValueB; 
        } else { 
         sValueB = sValueB + sValueB; 
         row[1] = sValueB; 
        } 

       } 
      } 

     } 
    } 

    public void createTable() { 
     oCTable = new JTable(); 
     oDefaultTableModel = new DefaultTableModel(); 
     oCTable.setModel(oDefaultTableModel); 
     oTableHeader = oCTable.getTableHeader(); 
     oCTable.setAutoResizeMode(oCTable.AUTO_RESIZE_OFF); 
     oCTable.setFillsViewportHeight(true); 
     JTable oTable = new LineNumberTable(oCTable); 
     oPane = new JScrollPane(oCTable); 
     oPane.setRowHeaderView(oTable); 
     JPanel oJPanel = new JPanel(); 
     oJPanel.setLayout(new BorderLayout()); 
     oJPanel.add(oPane, BorderLayout.CENTER); 
     JDialog oDialog = new JDialog(); 
     oDialog.add(oJPanel); 
     oDialog.setPreferredSize(new Dimension(500, 300)); 
     oDialog.pack(); 
     oDialog.setVisible(true); 

    } 

    public void insert() { 
     oDefaultTableModel.addColumn("Name"); 
     int iColumnPlace = ((DefaultTableModel) oCTable.getModel()).findColumn("Name"); 
     CellRendererForRowHeader oCellRendererForRowHeader = new CellRendererForRowHeader(); 
     TableColumn Column = oCTable.getColumn(oTableHeader.getColumnModel().getColumn(iColumnPlace).getHeaderValue()); 
     Column.setPreferredWidth(300); 
     Column.setMaxWidth(300); 
     Column.setMinWidth(250); 
     Column.setCellRenderer(oCellRendererForRowHeader); 



     for (int i = 0; i < 30; i++) { 
      Object[] row = new Object[1]; 
      String sValueA = "A"; 
      if (i % 2 == 0) { 
       if (i < 15) { 
        sValueA = sValueA + "a"; 
        oDefaultTableModel.insertRow(oCTable.getRowCount(), new Object[]{""}); 
        oDefaultTableModel.setValueAt(sValueA, i, 0); 
       } else { 
        if (i == 16) { 
         sValueA = sValueA + "b"; 
         oDefaultTableModel.insertRow(oCTable.getRowCount(), new Object[]{""}); 
         oDefaultTableModel.setValueAt(sValueA, i, 0); 
        } else { 
         sValueA = sValueA + "c"; 
         oDefaultTableModel.insertRow(oCTable.getRowCount(), new Object[]{""}); 
         oDefaultTableModel.setValueAt(sValueA, i, 0); 
        } 

       } 
      } else { 
       if (i < 15) { 
        sValueA = sValueA + "d"; 
        oDefaultTableModel.insertRow(oCTable.getRowCount(), new Object[]{""}); 
        oDefaultTableModel.setValueAt(sValueA, i, 0); 
       } else { 
        if (i == 17) { 
         sValueA = sValueA + "e"; 
         oDefaultTableModel.insertRow(oCTable.getRowCount(), new Object[]{""}); 
         oDefaultTableModel.setValueAt(sValueA, i, 0); 
        } else { 
         sValueA = sValueA + "f"; 
         oDefaultTableModel.insertRow(oCTable.getRowCount(), new Object[]{""}); 
         oDefaultTableModel.setValueAt(sValueA, i, 0); 
        } 

       } 
      } 

     } 
    } 

    public void showTable() { 
     createTable(); 
     insert(); 
     sortCTableonColumnIndex(0, true); 

    } 

    public void sortCTableonColumnIndex(int iColumnIndex, boolean bIsAsc) { 
     sorter = new TableRowSorter(oDefaultTableModel); 
     List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>(); 
     if (bIsAsc) { 
      sortKeys.add(new RowSorter.SortKey(iColumnIndex, SortOrder.ASCENDING)); 
     } else { 
      sortKeys.add(new RowSorter.SortKey(iColumnIndex, SortOrder.DESCENDING)); 
     } 
     sorter.setSortKeys(sortKeys); 
     oDefaultTableModel.fireTableStructureChanged(); 
     oCTable.updateUI(); 


    } 

    public static void main(String[] argu) { 
     Test oTest = new Test(); 
     oTest.showTable(); 


    } 

    class CellRendererForRowHeader extends DefaultTableCellRenderer { 

     public Component getTableCellRendererComponent(JTable table, Object value, 
       boolean isSelected, boolean hasFocus, int row, int column) { 
      JLabel label = null; 
      try { 
       label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
       if (column == 0) { 
        label.setBackground(new JLabel().getBackground()); 
        label.setForeground(Color.BLACK); 
       } 
      } catch (RuntimeException ex) { 
      } 
      return label; 

     } 
    } 

    class LineNumberTable extends JTable { 

     private JTable mainTable; 

     public LineNumberTable(JTable table) { 
      super(); 
      mainTable = table; 
      setAutoCreateColumnsFromModel(false); 
      setModel(mainTable.getModel()); 
      setAutoscrolls(false); 
      addColumn(new TableColumn()); 
      getColumnModel().getColumn(0).setCellRenderer(mainTable.getTableHeader().getDefaultRenderer()); 

      getColumnModel().getColumn(0).setPreferredWidth(40); 
      setPreferredScrollableViewportSize(getPreferredSize()); 

     } 

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

     @Override 
     public Object getValueAt(int row, int column) { 
      return Integer.valueOf(row + 1); 
     } 

     @Override 
     public int getRowHeight(int row) { 
      return mainTable.getRowHeight(); 
     } 
    } 
} 

回答

2

方法的輕微變化趨向於排序。

public void sortCTableonColumnIndex(int iColumnIndex, boolean bIsAsc) { 
     oCTable.setAutoCreateRowSorter(true); 
     DefaultRowSorter sorter = ((DefaultRowSorter) oCTable.getRowSorter()); 
     List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>(); 
     if (bIsAsc) { 
      sortKeys.add(new RowSorter.SortKey(iColumnIndex, SortOrder.ASCENDING)); 
     } else { 
      sortKeys.add(new RowSorter.SortKey(iColumnIndex, SortOrder.DESCENDING)); 
     } 
     sorter.setSortKeys(sortKeys); 
    } 

感謝

1

編寫Java代碼時,你真的應該堅持Java coding standards,但無論走哪條路線你去,你應該最起碼是一致的。

看着你的代碼,你實際上並沒有在桌子上設置分揀機。 From the JavaDocs從您的代碼缺少以下:

TableModel myModel = createMyTableModel(); 
JTable table = new JTable(myModel); 
table.setRowSorter(new TableRowSorter(myModel)); 

因此,這將是這個樣子在你的代碼(或至少已移除您的非標準約定)

public void createTable() { 
    tableModel = new DefaultTableModel(); 
    table = new JTable(tableModel); 
    sorter = new TableRowSorter<DefaultTableModel>(tableModel); 
    table.setRowSorter(sorter); 
    ... 
}