Diseño de JTable para sincronizar con la estructura de datos back-end

Tengo una JTable que se carga desde una estructura de datos usando un modelo de tabla. La estructura de datos tiene el formato NavigableMap<Float,NavigableMap> .Un ejemplo de datos es:

 Table Format: Range f1,v1 f2,v2 f3,v3 f4,v4 12.1-30.2 30,true 32,false 45,true 50,false 30.2-45.6 30,true 32.4,true 45,true 50.1,true 

El formato de datos anterior se representa en el DS como

 DS Format: Key Value 12.1 <,,,> 30.2 <,,,> 45.6 null 

He logrado representar los datos dados anteriormente en Jtable utilizando el modelo de tabla. Una vez que los datos se cargan desde el DS a la tabla, tengo que permitir la edición del usuario. Ahora es donde tengo un problema. Mi duda es si se debe mantener el estructura de datos sincronizada con los cambios en la tabla o debería recrear el DS de la tabla una vez que el usuario termine de editar y luego reemplazarlo con el anterior.

Más de lo que necesito para validar los datos (por ejemplo, desde arriba). Supongamos que el usuario quiere editar el valor 30.1. Solo se le debe permitir ingresar valores entre 12.1 y 45.6. Dado que los datos son tablas (una vez cargados) estoy planea usar regex y key-listener y consumir todas las pulsaciones de teclas del usuario que no coinciden con la regex y los valores que no entran dentro del rango. No estoy seguro si esta es una buena idea o cuáles son las implicaciones. gustaría obtener algunas sugerencias sobre esto.

Volvería a crear tu DS una vez que el usuario haya terminado de editar la tabla.

Siempre puede crear un editor personalizado para mostrar un diálogo emergente donde tiene dos campos de texto separados para cada valor del rango. Luego puede editar cada campo como un valor doble dentro de su rango especificado y recrear la cadena formateada antes de guardarla en el modelo. Aquí hay un viejo ejemplo que tengo por ahí para empezar:

 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; /* * The editor button that brings up the dialog. */ //public class TablePopupEditor extends AbstractCellEditor public class TablePopupEditor extends DefaultCellEditor implements TableCellEditor { private PopupDialog popup; private String currentText = ""; private JButton editorComponent; public TablePopupEditor() { super(new JTextField()); setClickCountToStart(2); // Use a JButton as the editor component editorComponent = new JButton(); editorComponent.setBackground(Color.white); editorComponent.setBorderPainted(false); editorComponent.setContentAreaFilled( false ); // Set up the dialog where we do the actual editing popup = new PopupDialog(); } public Object getCellEditorValue() { return currentText; } public Component getTableCellEditorComponent( JTable table, Object value, boolean isSelected, int row, int column) { SwingUtilities.invokeLater(new Runnable() { public void run() { System.out.println("run"); popup.setText( currentText ); // popup.setLocationRelativeTo( editorComponent ); Point p = editorComponent.getLocationOnScreen(); popup.setLocation(px, py + editorComponent.getSize().height); popup.show(); fireEditingStopped(); } }); currentText = value.toString(); editorComponent.setText( currentText ); return editorComponent; } /* * Simple dialog containing the actual editing component */ class PopupDialog extends JDialog implements ActionListener { private JTextArea textArea; public PopupDialog() { super((Frame)null, "Change Description", true); textArea = new JTextArea(5, 20); textArea.setLineWrap( true ); textArea.setWrapStyleWord( true ); KeyStroke keyStroke = KeyStroke.getKeyStroke("ENTER"); textArea.getInputMap().put(keyStroke, "none"); JScrollPane scrollPane = new JScrollPane( textArea ); getContentPane().add( scrollPane ); JButton cancel = new JButton("Cancel"); cancel.addActionListener( this ); JButton ok = new JButton("Ok"); ok.setPreferredSize( cancel.getPreferredSize() ); ok.addActionListener( this ); JPanel buttons = new JPanel(); buttons.add( ok ); buttons.add( cancel ); getContentPane().add(buttons, BorderLayout.SOUTH); pack(); getRootPane().setDefaultButton( ok ); } public void setText(String text) { textArea.setText( text ); } /* * Save the changed text before hiding the popup */ public void actionPerformed(ActionEvent e) { if ("Ok".equals( e.getActionCommand() ) ) { currentText = textArea.getText(); } textArea.requestFocusInWindow(); setVisible( false ); } } public static void main(String[] args) { String[] columnNames = {"Item", "Description"}; Object[][] data = { {"Item 1", "Description of Item 1"}, {"Item 2", "Description of Item 2"}, {"Item 3", "Description of Item 3"} }; JTable table = new JTable(data, columnNames); table.getColumnModel().getColumn(1).setPreferredWidth(300); table.setPreferredScrollableViewportSize(table.getPreferredSize()); JScrollPane scrollPane = new JScrollPane(table); // Use the popup editor on the second column TablePopupEditor popupEditor = new TablePopupEditor(); table.getColumnModel().getColumn(1).setCellEditor( popupEditor ); JFrame frame = new JFrame("Popup Editor Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add( scrollPane ); frame.pack(); frame.setLocationRelativeTo( null ); frame.setVisible(true); } }