Maintenir le rendu des cellules JTable après la modification de la cellule
Dans une JTable, la mise en œuvre de capacités de rendu et d'édition de cellules personnalisées peut améliorer l'expérience utilisateur. Cependant, il est crucial de s'assurer que le formatage souhaité est conservé même après les opérations d'édition.
Le problème
Après avoir configuré un moteur de rendu de cellules personnalisé pour formater un « prix » colonne, les utilisateurs ont rencontré une divergence dans laquelle le format numérique était perdu lors de la modification de la cellule. Dans de tels scénarios, la valeur par défaut du rendu de cellule peut ne pas être appliquée une fois la modification validée.
La solution
Pour conserver le rendu personnalisé après la modification de la cellule, il est essentiel d'utiliser les déclencheurs d'événements et les classes appropriés. Une fois l'édition terminée, la méthode editorStopped() de JTable collecte la nouvelle valeur via getCellEditorValue(). Le modèle est ensuite notifié avec setValueAt() et doit ensuite appeler fireTableCellUpdated(). Ce processus complet appelle le moteur de rendu, qui peut être étendu pour gérer des besoins de formatage particuliers.
Considérations supplémentaires
Pour des exigences de formatage plus complexes, il est recommandé d'envisager d'utiliser une instance du moteur de rendu personnalisé en tant que composant d'éditeur lui-même. Cela permet un meilleur contrôle sur l'apparence et le comportement de la cellule, garantissant un formatage cohérent même après des modifications de cellule.
Exemple
L'extrait de code suivant fournit un exemple d'implémentation qui montre comment pour formater les valeurs monétaires sous forme de nombres dans les cellules JTable. Le moteur de rendu personnalisé (CurrencyRenderer) gère le formatage de la devise, tandis que l'éditeur personnalisé (CurrencyEditor) permet aux utilisateurs de modifier les valeurs tout en conservant le formatage.
import java.awt.Component; import java.awt.event.MouseEvent; import java.text.NumberFormat; import javax.swing.DefaultCellEditor; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.DefaultTableCellRenderer; // Custom cell renderer for currency formatting public class CurrencyRenderer extends DefaultTableCellRenderer { private NumberFormat formatter; public CurrencyRenderer(NumberFormat formatter) { this.formatter = formatter; setHorizontalAlignment(JLabel.RIGHT); } @Override public void setValue(Object value) { setText((value == null) ? "" : formatter.format(value)); } } // Custom cell editor for currency input, maintaining the formatting public class CurrencyEditor extends DefaultCellEditor { private NumberFormat formatter; private JTextField textField; public CurrencyEditor(NumberFormat formatter) { super(new JTextField()); this.formatter = formatter; textField = (JTextField) getComponent(); textField.setHorizontalAlignment(JTextField.RIGHT); textField.setBorder(null); } @Override public Object getCellEditorValue() { try { return new Double(textField.getText()); } catch (NumberFormatException e) { return Double.valueOf(0); } } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { textField.setText((value == null) ? "" : formatter.format((Double) value)); return textField; } }
En incorporant ces techniques, les développeurs peuvent garantir un rendu de cellule personnalisé et les capacités d'édition fonctionnent de manière transparente dans JTable, offrant une expérience de manipulation de données cohérente et conviviale.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!