レンダリング編集番号: セル編集後の JTable 形式の維持
カスタム セル レンダリングで JTable を拡張する場合、そのレンダリングを維持することが重要ですセル編集後。これには、セル レンダラー内の書式設定の保持が含まれます。
問題:
カスタム セル レンダラーで書式設定された JTable 列の JTextField エディタを実装した後、セルのカスタムが失われます。編集時のレンダリング
解決策:
セル値の変更時にモデルがレンダラーを更新しないため、書式設定の損失が発生します。これを修正するには、テーブル モデルの変更後にセル レンダラーが必ず呼び出されるようにします。
実装:
サンプル コード:
提供されているサンプル コードは、JTable を作成することによるこのアプローチを示しています。セル編集後に書式設定を維持する通貨書式設定された列:
import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.text.NumberFormat; import java.util.EventObject; public class RenderEditNumber extends JPanel { private NumberFormat nf = NumberFormat.getCurrencyInstance(); public RenderEditNumber() { DefaultTableModel model = new DefaultTableModel( new String[]{"Amount"}, 0) { @Override public Class<?> getColumnClass(int columnIndex) { return Double.class; } }; for (int i = 0; i < 16; i++) { model.addRow(new Object[]{Double.valueOf(i)}); } JTable table = new JTable(model) { @Override // Always selectAll() public boolean editCellAt(int row, int column, EventObject e) { boolean result = super.editCellAt(row, column, e); final Component editor = getEditorComponent(); if (editor == null || !(editor instanceof JTextComponent)) { return result; } EventQueue.invokeLater(new Runnable() { @Override public void run() { ((JTextComponent) editor).selectAll(); } }); return result; } }; table.setDefaultRenderer(Double.class, new CurrencyRenderer(nf)); table.setDefaultEditor(Double.class, new CurrencyEditor(nf)); add(new JScrollPane(table)); } public static void main(String[] args) { EventQueue.invokeLater(() -> new RenderEditNumber().display()); } } 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)); } } 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; } }
これを利用することでこのアプローチでは、JTable セルは編集後でもカスタマイズされたレンダリングを維持するため、一貫したデータ表示とユーザー エクスペリエンスの向上が可能になります。
以上が編集後にカスタム JTable セルのレンダリングを維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。