2015-02-09 24 views
0

我已經嘗試了很多事情來顯示逗號而不是我的JTable中的點在「德國」風格。在我的JTable-Class中,我編寫了一個用於循環傳遞ResultSet的方法,用於填充DefaultTableModel並直接返回Model或JTable。用逗號替換點在JTable中導致錯誤的排序順序

如果我將BigDecimal強制轉換爲字符串以便用逗號替換一個點,則結果將在我的JTable中正確顯示 - 但隨後我的排序順序不正確,因爲值將按字符串排序,而不是BigDecimal ...

另一個解決方案是直接通過SQL語句進行排序,並在點擊行標題時動態更改排序順序 - 但這對我來說不是最好的解決方案,因爲內容我的表是通過執行很多查詢花費很多時間生成的。

我試圖設置我的JTable的語言環境,但沒有真正的工作。

任何人的想法,如何以德語格式顯示?

非常感謝!

這裏是我的類:

import java.math.BigDecimal; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 
import java.util.Locale; 
import java.util.Vector; 

import javax.swing.JTable; 
import javax.swing.RowSorter; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 


public class MyJTable extends JTable { 

private static final long serialVersionUID = 1L;  

public MyJTable(){  
    this.setLocale(Locale.GERMANY); 
} 

public MyJTable(ResultSet rs) throws SQLException{   
      DefaultTableModel model = this.getTableModel(rs); 
      this.setModel(model); 
      RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); 
      this.setRowSorter(sorter); 
      this.setLocale(Locale.GERMANY); 
} 

public DefaultTableModel getTableModel(ResultSet rs) throws SQLException{ 

    ResultSetMetaData metaData = rs.getMetaData(); 
    // names of columns 
    Vector<String> columnNames = new Vector<String>(); 
    int columnCount = metaData.getColumnCount(); 
    for (int column = 1; column <= columnCount; column++) { 
     columnNames.add(metaData.getColumnName(column)); 
    } 
    // data of the table 
    Vector<Vector<Object>> data = new Vector<Vector<Object>>(); 
    String bigdecimal=null; 
    Object obigdecimal; 
    while (rs.next()) { 
     Vector<Object> vector = new Vector<Object>(); 
     for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { 

      if  (metaData.getColumnClassName(columnIndex).equals("java.math.BigDecimal")){ 
       bigdecimal=rs.getString(columnIndex); 
       if (bigdecimal!=null){ 
       bigdecimal=bigdecimal.replace(".",","); 
       obigdecimal=bigdecimal; 
       vector.add(obigdecimal); 
       }    
      } 
      else 
      { 
      vector.add(rs.getObject(columnIndex)); 
      }    
      } 
     data.add(vector); 
} 

    return new DefaultTableModel(data, columnNames){ 

     private static final long serialVersionUID = 1L; 

      public Class getColumnClass(int column) { 
       Class returnValue=Object.class; 
       try{ 
       if ((column >= 0) && (column < getColumnCount())) { 
        returnValue = getValueAt(0, column).getClass(); 
       } else { 
        returnValue = Object.class; 
       }      
       } 
       catch(Exception e){}      
       return returnValue; 
       } 
      };  
    } 
} 
+3

你有沒有想過使用TableCellRender。使用渲染只會影響數據的顯示,而不影響數據本身,所以它不會影響排序。大多數示例顯示它用於Checkboxes,Combos,但可用於重新格式化文本顯示。請參閱http://docs.oracle.com/javase/tutorial/uiswing/components/table.html – 2015-02-09 10:42:47

回答

1

JTable中替換逗號點會導致錯誤的排序序列

問題的一小部分是您的數據混合起來本身應該如何顯示或渲染。

但是,主要問題恕我直言,你不要在你的表模型中覆蓋getColumnClass(int columnIndex):我永遠不會相信要求模型的第一行單元格的類。如果getValueAt(0,1)返回null?答:您會在getValueAt(0,1).getClass()致電NullPointerException

現在考慮到您的問題中的上下文,您無法提供合適的TableCellRenderer,因爲您不知道結果集將事先返回哪個類。然而,你可以依靠Concepts: Editor and Renderers說明的默認行爲,並覆蓋getColumnClass(...)方法使用ResultSetMetaData如下返回正確的類:

public TableModel getTableModel(ResultSet resultSet) throws SQLException {  
    ResultSetMetaData metaData = resultSet.getMetaData();   

    int columnCount = metaData.getColumnCount(); // columns number 
    String[] columnNames = new String[columnCount]; 
    final Class[] columnClasses = new Class[columnCount]; 

    for (int i = 1; i <= columnCount; i++) { 
     columnNames[i-1] = metaData.getColumnName(i); // fill columns names 
     try { 
      columnClasses[i-1] = Class.forName(metaData.getColumnClassName(i)); // fill column classes 
     } catch (ClassNotFoundException ex) { 
      // Log the exception here 
     } 
    } 

    resultSet.last(); 
    int rowCount = resultSet.getRow(); // get rows number 
    resultSet.beforeFirst(); 

    Object[][] data = new Object[rowCount][columnCount]; 
    int currentRow = 0; 
    while (resultSet.next()) { 
     for (int currentColumn = 1; currentColumn <= columnCount; currentColumn++) { 
      data[currentRow][currentColumn - 1] = resultSet.getObject(currentColumn); // fill data set 
     } 
     currentRow++; 
    } 

    TableModel model = new DefaultTableModel(data, columnNames) { 
     @Override 
     public Class<?> getColumnClass(int columnIndex) { 
      return columnClasses[columnIndex]; 
     } 
    } 
    return model;  
} 

注:使用Object[]代替Vector僅僅是因爲我有代碼somewhere else,我懶得修改它。

0

但後來我的排序,順序是不正確的,因爲該值將被歸類爲一個字符串,而不是一個BigDecimal ...

不要存放在TableModel的字符串。存儲BigDecimal。

如果我投一個BigDecimal的字符串用逗號更換點,

格式化數據是渲染器的工作。查看Table Format Renderers,瞭解如何覆蓋呈現器的setValue(...)方法的簡單示例。

您還需要重寫getColumnClass(...)方法以返回BigDecimal,以便可以完成相應的排序。