簡體   English   中英

java 中的自定義表格單元格編輯器,列數據類型為 Float

[英]Custom table cell editor in java with column data type Float

正如我們所知,默認情況下,在 JTable 中編輯單元格時,我們必須按兩次 Enter 鍵才能更改選擇。

為了覆蓋此行為,我正在嘗試編寫一個自定義表格單元格編輯器,在其中按一次 Enter 鍵后,當前單元格中的編輯完成,選擇更改為下一行並在新選擇的單元格中開始編輯並自動選擇其內容。

整個場景適用於整數但不適用於 FLOAT 數據類型。 對於數據類型為 Float/Double 的列,我收到錯誤

java.lang.IllegalArgumentException:無法將 Object 格式化為數字

當按下 Enter 鍵改變選擇時。

我正在使用在線搜索時發現的以下代碼。

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;
        }
     }
}

您為1列建模的getColumnClass()實現返回Float.class ,因此您的getCellEditorValue()實現應該返回相同類型的值:

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

或者,您可以通過 class 指定編輯器:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM