繁体   English   中英

验证JTable输入获取双错误消息

[英]Verifying JTable Input Gets Double Error Message

我试图编写一个TableCellEditor来验证JTable单元的输入。 我有它的工作,除了错误消息被显示两次。 这是我的测试人员课程:

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

我显然没有正确地做这件事,因为我从一个未知的消息来源那里得到了例外:

线程“ AWT-EventQueue-0”中的异常java.lang.IllegalArgumentException:无法将给定对象格式化为数字

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

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

目的是确保用户输入数字值或根本不输入任何值(“”)。

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

单元格周围将出现一个红色边框,直到解决问题,您才能保存数据。

无法将给定对象格式化为数字

编辑:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM