【问题标题】:Custom table cell editor in java with column data type Floatjava中具有列数据类型Float的自定义表格单元格编辑器
【发布时间】:2017-07-14 16:25:44
【问题描述】:

默认情况下,我们必须在编辑 JTable 中的单元格时按两次 Enter 键来更改选择。 为了覆盖这种行为,我正在尝试编写一个自定义表格单元格编辑器,其中在单次 Enter 键按下时,当前单元格中的编辑完成,选择更改为下一行,并在新选择的单元格中开始编辑,并自动选择其内容。

整个场景对于整数都可以正常工作,但对于浮点数据类型则不行。 对于数据类型为 Float/Double 的列,我得到错误

java.lang.IllegalArgumentException:无法将给定的对象格式化为数字

当按下 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;
        }
     }
}

【问题讨论】:

  • 当您编辑您的问题以包含一个展示您描述的问题的minimal reproducible example 时,请包含您对getColumnClass() 的实现。
  • 我已经用完整的例子更新了上面的代码。
  • 我已经用完整的例子更新了上面的代码。在 Integer 列中按一次 ENTER 键,完成当前单元格的编辑,直接选择下一个单元格进入编辑模式并全选。引发浮点数格式错误。
  • 我已经在下面详细说明了。

标签: java swing jtable tablecelleditor


【解决方案1】:

您模型对列1getColumnClass() 实现返回Float.class,因此您的getCellEditorValue() 实现应该返回相同类型的值:

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

作为替代方案,您可以按类指定编辑器:

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

【讨论】:

  • 非常感谢。使用上面的方法,我为第 1 列返回整数类型,为第 2 列返回浮点类型,效果很好。
猜你喜欢
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 2016-12-29
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
相关资源
最近更新 更多