验证 JTable 输入获取双重错误消息
Verifying JTable Input Gets Double Error Message
我正在尝试编写一个 TableCellEditor 来验证 JTable 单元格的输入。除了错误消息被显示两次外,我让它工作。这是我的测试仪 class:
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
public class Tester {
public static void main(String[] args) {
JFrame frame=new JFrame();
frame.setPreferredSize(new Dimension(500,100));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultTableModel model=new DefaultTableModel(null,new String[] {"Col 1","Col 2"});
JTable table=new JTable(model);
table.getColumnModel().getColumn(0).setCellEditor(new decimalCellEditor());
model.insertRow(0,new Object[] {null,null});
JScrollPane scroller=new JScrollPane(table);
frame.add(scroller);
frame.setVisible(true);
frame.pack();
}
}
这是编辑:
import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;
public class DecimalCellEditor extends AbstractCellEditor implements TableCellEditor {
/**
*
*/
private static final long serialVersionUID = 1L;
private JTextField number=null;
public DecimalCellEditor() {
number=new JTextField();
}
@Override
public Object getCellEditorValue() {
String s=number.getText();
if (s.equals("")) {
return(s);
}
double x=0.;
try {
x=Double.parseDouble(s);
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null,"Value must be numeric",null, JOptionPane.ERROR_MESSAGE, null);
return("");
}
return(Double.toString(x));
}
@Override
public Component getTableCellEditorComponent(JTable table_, Object value_, boolean isSelected_, int row_, int column_) {
number.setText(String.valueOf(value_));
return(number);
}
@Override
public boolean stopCellEditing() {
String s=(String) getCellEditorValue();
if (s.equals("")) {
return(super.stopCellEditing());
}
try {
Double.parseDouble(s);
} catch (NumberFormatException e) {
fireEditingCanceled();
return(false);
}
return(super.stopCellEditing());
}
}
objective 是为了确保用户输入数值或根本不输入任何值 ("")。是什么导致错误在非数字时显示和消除两次,我该如何阻止它? TIA.
执行 camickr 的建议
假设我理解了建议,我不需要编辑器?
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class Tester {
public static void main(String[] args) {
JFrame frame=new JFrame();
frame.setPreferredSize(new Dimension(500,100));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyTableModel model=new MyTableModel(null,new String[] {"Col 1","Col 2"});
JTable table=new JTable(model);
model.insertRow(0,new Object[] {"",""});
JScrollPane scroller=new JScrollPane(table);
frame.add(scroller);
frame.setVisible(true);
frame.pack();
}
}
正在覆盖 getColumnClass:
import javax.swing.table.DefaultTableModel;
public class MyTableModel extends DefaultTableModel {
/**
*
*/
private static final long serialVersionUID = 1L;
public MyTableModel(Object[][] data_,String[] columnNames_) {
super(data_,columnNames_);
}
@Override
public Class<?> getColumnClass(int column_) {
if (column_==0) {
return(Double.class);
}
return(getValueAt(0,column_).getClass());
}
}
我显然没有做对,因为我从未知来源那里得到例外说:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Cannot format given Object as a Number
我猜我的构造函数有问题。
首先 class 名称应以大写字符开头。您已获得 link 提供演示代码的 Swing 教程。我确定您可以访问 Java API。 API 和示例都遵循相同的约定。通过示例学习并遵循 Java 约定!
The objective is to assure the user enters a numeric value or no value at all ("").
只需将 TableModel 的 getColumnClass(...) 方法重写为列的 return Double.class,JTable 将使用适当的编辑器和渲染器。
单元格周围会出现红色边框,在解决问题之前您将无法保存数据。
Cannot format given Object as a Number
编辑:
花点时间想想你刚刚做出的改变。花时间阅读错误消息。您的更改只是说明该列应包含 Double
数据。那么为什么要在第一列中添加 "empty" 字符串。渲染器如何将 String 转换为 Double?
同样,如果您阅读 Java 教程中的代码,您将了解如何将数字数据添加到 TableModel。我很久以前就给了你一个 link 教程,因为它包含许多基础知识。
我正在尝试编写一个 TableCellEditor 来验证 JTable 单元格的输入。除了错误消息被显示两次外,我让它工作。这是我的测试仪 class:
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
public class Tester {
public static void main(String[] args) {
JFrame frame=new JFrame();
frame.setPreferredSize(new Dimension(500,100));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultTableModel model=new DefaultTableModel(null,new String[] {"Col 1","Col 2"});
JTable table=new JTable(model);
table.getColumnModel().getColumn(0).setCellEditor(new decimalCellEditor());
model.insertRow(0,new Object[] {null,null});
JScrollPane scroller=new JScrollPane(table);
frame.add(scroller);
frame.setVisible(true);
frame.pack();
}
}
这是编辑:
import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;
public class DecimalCellEditor extends AbstractCellEditor implements TableCellEditor {
/**
*
*/
private static final long serialVersionUID = 1L;
private JTextField number=null;
public DecimalCellEditor() {
number=new JTextField();
}
@Override
public Object getCellEditorValue() {
String s=number.getText();
if (s.equals("")) {
return(s);
}
double x=0.;
try {
x=Double.parseDouble(s);
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null,"Value must be numeric",null, JOptionPane.ERROR_MESSAGE, null);
return("");
}
return(Double.toString(x));
}
@Override
public Component getTableCellEditorComponent(JTable table_, Object value_, boolean isSelected_, int row_, int column_) {
number.setText(String.valueOf(value_));
return(number);
}
@Override
public boolean stopCellEditing() {
String s=(String) getCellEditorValue();
if (s.equals("")) {
return(super.stopCellEditing());
}
try {
Double.parseDouble(s);
} catch (NumberFormatException e) {
fireEditingCanceled();
return(false);
}
return(super.stopCellEditing());
}
}
objective 是为了确保用户输入数值或根本不输入任何值 ("")。是什么导致错误在非数字时显示和消除两次,我该如何阻止它? TIA.
执行 camickr 的建议
假设我理解了建议,我不需要编辑器?
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class Tester {
public static void main(String[] args) {
JFrame frame=new JFrame();
frame.setPreferredSize(new Dimension(500,100));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyTableModel model=new MyTableModel(null,new String[] {"Col 1","Col 2"});
JTable table=new JTable(model);
model.insertRow(0,new Object[] {"",""});
JScrollPane scroller=new JScrollPane(table);
frame.add(scroller);
frame.setVisible(true);
frame.pack();
}
}
正在覆盖 getColumnClass:
import javax.swing.table.DefaultTableModel;
public class MyTableModel extends DefaultTableModel {
/**
*
*/
private static final long serialVersionUID = 1L;
public MyTableModel(Object[][] data_,String[] columnNames_) {
super(data_,columnNames_);
}
@Override
public Class<?> getColumnClass(int column_) {
if (column_==0) {
return(Double.class);
}
return(getValueAt(0,column_).getClass());
}
}
我显然没有做对,因为我从未知来源那里得到例外说:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Cannot format given Object as a Number
我猜我的构造函数有问题。
首先 class 名称应以大写字符开头。您已获得 link 提供演示代码的 Swing 教程。我确定您可以访问 Java API。 API 和示例都遵循相同的约定。通过示例学习并遵循 Java 约定!
The objective is to assure the user enters a numeric value or no value at all ("").
只需将 TableModel 的 getColumnClass(...) 方法重写为列的 return Double.class,JTable 将使用适当的编辑器和渲染器。
单元格周围会出现红色边框,在解决问题之前您将无法保存数据。
Cannot format given Object as a Number
编辑:
花点时间想想你刚刚做出的改变。花时间阅读错误消息。您的更改只是说明该列应包含 Double
数据。那么为什么要在第一列中添加 "empty" 字符串。渲染器如何将 String 转换为 Double?
同样,如果您阅读 Java 教程中的代码,您将了解如何将数字数据添加到 TableModel。我很久以前就给了你一个 link 教程,因为它包含许多基础知识。