【问题标题】:Swing: catching exceptions from TableModelSwing:从 TableModel 中捕获异常
【发布时间】:2013-12-05 02:48:02
【问题描述】:

如果用户输入无效值,我有一个 TableModel 可能会在其 setValueAt 方法上引发异常:

public class MyTableModel extends AbstractTableModel {
    public void setValueAt(Object value, int rowIndex, int columnIndex) {
        String valueStr = (String) value;
        // some basic failure state
        if(valueStr.length()>5) {
            throw new ValidationException("Value should have up to 5 characters");
        }
        this.currentValue = valueStr;
    }
}

问题是:另一个类如何捕获这个异常?它可能会显示弹出消息,或者更新状态栏,或者将单元格涂成红色。无论我选择做什么,我认为TableModel 不应该这样做。

【问题讨论】:

    标签: java swing exception-handling tablemodel


    【解决方案1】:

    大概您正在使用 JTable 来编辑单元格,因此您可以使用自定义编辑器:

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.table.*;
    
    public class TableFiveCharacterEditor extends DefaultCellEditor
    {
        private long lastTime = System.currentTimeMillis();
    
        public TableFiveCharacterEditor()
        {
            super( new JTextField() );
        }
    
        public boolean stopCellEditing()
        {
            JTable table = (JTable)getComponent().getParent();
    
            try
            {
                String editingValue = (String)getCellEditorValue();
    
                if(editingValue.length() != 5)
                {
                    JTextField textField = (JTextField)getComponent();
                    textField.setBorder(new LineBorder(Color.red));
                    textField.selectAll();
                    textField.requestFocusInWindow();
    
                    JOptionPane.showMessageDialog(
                        table,
                        "Please enter string with 5 letters.",
                        "Alert!",JOptionPane.ERROR_MESSAGE);
                    return false;
                }
            }
            catch(ClassCastException exception)
            {
                return false;
            }
    
            return super.stopCellEditing();
        }
    
        public Component getTableCellEditorComponent(
            JTable table, Object value, boolean isSelected, int row, int column)
        {
            Component c = super.getTableCellEditorComponent(
                table, value, isSelected, row, column);
            ((JComponent)c).setBorder(new LineBorder(Color.black));
    
            return c;
        }
    
        private static void createAndShowUI()
        {
            JTable table = new JTable(5, 5);
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            JScrollPane scrollPane = new JScrollPane(table);
    
            //  Use a custom editor
    
            TableCellEditor fce = new TableFiveCharacterEditor();
            table.setDefaultEditor(Object.class, fce);
    
            JFrame frame = new JFrame("Table Five Character Editor");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add( scrollPane );
            frame.pack();
            frame.setLocationByPlatform( true );
            frame.setVisible( true );
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowUI();
                }
            });
        }
    }
    

    【讨论】:

    • 可以在here 找到令人信服的证明。
    • @MadProgrammer,被指控有罪。您还忘了提到没有理由扩展 JFrame。关于旧示例的观点……;)我周围有太多的东西,我忘记更新它们。代码已更新。
    【解决方案2】:

    第一种选择是使用Thread.setDefaultUncaughtExceptionHandler

    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        public void uncaughtException(Thread t, Throwable e) {
            if(e instanceof ValidationException) {
                JOptionPane.showConfirmDialog(someframe, e.getMessage());
            }
        }
    });
    

    但我不确定是否有更合适的方法来处理这种情况,比如某种异常监听器。

    【讨论】:

      猜你喜欢
      • 2010-10-18
      • 1970-01-01
      • 2013-07-13
      • 2016-10-31
      • 2011-05-07
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多