2017-02-24 41 views
1

正如我們所知,默認情況下,我們必須按兩次Enter鍵才能在JTable中編輯單元格時更改選擇內容。 要重寫此行爲,我試圖編寫一個自定義表格單元格編輯器,其中當單個Enter鍵按下時,當前單元格中的編輯完成,選擇更改爲下一行,並在新選定的單元格中開始編輯,並自動選擇其內容。在java中使用列數據類型的自定義表格單元格編輯器Float

整個場景對整數工作正常,但不適用於FLOAT數據類型。 與數據類型float列/雙I得到錯誤

java.lang.IllegalArgumentException異常:無法格式化給定的對象作爲數

按下更改選擇時輸入。

請在這方面的任何幫助。 我正在使用以下代碼,這是我在網上搜索時發現的。

package javaapplication1; 

import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.AbstractCellEditor; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableColumn; 
import javax.swing.text.JTextComponent; 

/** 
* 
* @author alqama 
*/ 
public class test extends JPanel{ 

    private JTable table; 

    test() 
    { 
     table = new JTable(){ 

     @Override 
     public void changeSelection( int row, int column, boolean toggle, boolean extend) 
     { 
      super.changeSelection(row, column, toggle, extend); 

      if (editCellAt(row, column)) 
      { 
       Component editor = getEditorComponent(); 
       editor.requestFocusInWindow(); 
       ((JTextComponent) editor).selectAll(); 

      } 
     }}; 
     DefaultTableModel dtm = new javax.swing.table.DefaultTableModel(
       new Object [][] { 

        }, 
       new String [] { "Integer","Float"} 
      ) { 
       public Class getColumnClass(int col) { 
       if(col==0) return java.lang.Integer.class; 
       return java.lang.Float.class; 
      } 

      public boolean isCellEditable(int rowIndex, int columnIndex) { 
       return true; 
      } 
     }; 
     table.setModel(dtm); 
     CustomTableCellEditor et = new CustomTableCellEditor(table); 
     table.getColumnModel().getColumn(1).setCellEditor(et); 
     table.getColumnModel().getColumn(0).setCellEditor(et); 

     for (int i = 0; i < 5; i++) { 
      dtm.addRow(new Object[]{i,1.5+i}); 
     }  


     table.setPreferredScrollableViewportSize(new Dimension(123, 123)); 
     this.add(new JScrollPane(table)); 

    } 
    private void display() { 
     JFrame f = new JFrame("Test Table"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       new test().display(); 
      } 
     }); 
    } 




    protected class CustomTableCellEditor extends AbstractCellEditor implements TableCellEditor { 

     private JTable table; 
     JTextField component = new JTextField(); 

     public CustomTableCellEditor(JTable table) { 
      this.table = table; 
     } 

     public boolean stopCellEditing() { 

      boolean ans = super.stopCellEditing();    
      return ans; 
     } 

     @Override 
     public void cancelCellEditing() { 
      super.cancelCellEditing(); 
     } 

     @Override 
     public Object getCellEditorValue() { 
      return component.getText();   
     } 

     @Override 
     public Component getTableCellEditorComponent(JTable arg0, Object value, 
       boolean arg2, int arg3, int arg4) { 
      component.setText(value.toString()); 
      return component; 
     } 
    } 
} 
+0

當你編輯你的問題時,請包括你的'getColumnClass()'實現包含一個[mc ve]表現出你描述的問題。 – trashgod

+0

我已經用完整的示例更新了上面的代碼。 –

+0

我已經用完整的示例更新了上面的代碼。用單個ENTER鍵在整數列中按下,當前單元格編輯完成,下一個單元格直接選擇編輯模式並選擇全部。對於浮點數格式錯誤會引發。 –

回答

1
1回報 Float.class,所以你的 getCellEditorValue()實現應返回相同類型的值的 getColumnClass()

您模型的實現:

@Override 
public Object getCellEditorValue() { 
    return Float.valueOf(component.getText());   

作爲替代方案,你可以指定類的編輯器:

CustomTableCellEditor et = new CustomTableCellEditor(table); 
table.setDefaultEditor(Float.class, et); 
+1

非常感謝。使用上面,我返回列1的整數類型和列2的浮動類型,它很好。 –

相關問題