java - setrowsorter - Swing: capturando excepciones de TableModel
setrowsorter java (2)
Tengo un setValueAt
que puede lanzar una excepción en su método setValueAt
si el usuario ingresa un valor no válido:
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;
}
}
La pregunta es: ¿cómo puede otra clase atrapar esta excepción? Puede mostrar un mensaje emergente, actualizar una barra de estado o pintar la celda de color rojo. Todo lo que elegí hacer, no creo que TableModel
debería estar haciendo eso.
Es de suponer que está utilizando una JTable para editar la celda para que pueda usar un editor personalizado:
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();
}
});
}
}
La primera alternativa es usar Thread.setDefaultUncaughtExceptionHandler
:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
if(e instanceof ValidationException) {
JOptionPane.showConfirmDialog(someframe, e.getMessage());
}
}
});
pero no estoy seguro de si hay una manera más adecuada de manejar esta situación, como una especie de oyente de excepción.