java 中的自定义 table 单元格编辑器,列数据类型为 Float
Custom table cell editor in java with column data type Float
正如我们所知,默认情况下,在 JTable 中编辑单元格时,我们必须按两次 Enter 键才能更改选择。
为了覆盖此行为,我正在尝试编写一个自定义 table 单元格编辑器,在该编辑器中按一次 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;
}
}
}
您为列 1
returns Float.class
建模了 getColumnClass()
的实现,因此您对 getCellEditorValue()
的实现应该 return 一个值同类型:
@Override
public Object getCellEditorValue() {
return Float.valueOf(component.getText());
作为替代方案,您可以通过 class:
指定编辑器
CustomTableCellEditor et = new CustomTableCellEditor(table);
table.setDefaultEditor(Float.class, et);
正如我们所知,默认情况下,在 JTable 中编辑单元格时,我们必须按两次 Enter 键才能更改选择。 为了覆盖此行为,我正在尝试编写一个自定义 table 单元格编辑器,在该编辑器中按一次 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;
}
}
}
您为列 1
returns Float.class
建模了 getColumnClass()
的实现,因此您对 getCellEditorValue()
的实现应该 return 一个值同类型:
@Override
public Object getCellEditorValue() {
return Float.valueOf(component.getText());
作为替代方案,您可以通过 class:
指定编辑器CustomTableCellEditor et = new CustomTableCellEditor(table);
table.setDefaultEditor(Float.class, et);