gpt4 book ai didi

java - 验证 JTable 输入收到双重错误消息

转载 作者:行者123 更新时间:2023-12-02 11:43:11 25 4
gpt4 key购买 nike

我正在尝试编写一个 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());
}
}

目标是确保用户输入数值或根本不输入任何值 ("")。当错误为非数字时,是什么导致错误显示并消除两次?如何阻止它? 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

我猜我的构造函数有问题。

最佳答案

首先,类名应该以大写字符开头。您已获得提供演示代码的 Swing 教程的链接。我确信您可以访问 Java API。 API 和示例都遵循相同的约定。通过示例学习并遵循 Java 约定!

The objective is to assure the user enters a numeric value or no value at all ("").

只需重写 TableModel 的 getColumnClass(...) 方法即可返回列的 Double.class,JTable 将使用适当的编辑器和渲染器。

单元格周围将出现红色边框,并且在解决问题之前您将无法保存数据。

Cannot format given Object as a Number

编辑:

花点时间思考一下您刚刚所做的改变。花点时间阅读错误消息。您的更改只是指出该列应包含 Double 数据。那么为什么要在第一列中添加“空”字符串呢?渲染器如何将 String 转换为 Double?

同样,如果您阅读 Java 教程中的代码,您将看到数字数据如何添加到 TableModel。我很久以前就给了您该教程的链接,因为它包含许多基础知识。

关于java - 验证 JTable 输入收到双重错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48385703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com