ホームページ > Java > &#&チュートリアル > セル編集後に JTable セルのレンダリングを維持するにはどうすればよいですか?

セル編集後に JTable セルのレンダリングを維持するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-07 05:05:14
オリジナル
154 人が閲覧しました

How to Maintain JTable Cell Rendering After a Cell Edit?

セル編集後の JTable セル レンダリングの維持

問題

JTable 列を String として設定し、Double として並べ替えた後、カスタムセル レンダラは、最初に列を $###,##0.00 として書式設定していましたが、値がゼロになった後、セルのレンダリングを停止します。

解決策

イベント フローを理解する

セルが編集されると、次のイベントが順番に発生します:

  1. エディターは終了します。 .
  2. テーブル内のeditingStopped() メソッドは、新しいデータを収集します。 value.
  3. モデル内の setValueAt() が新しい値で呼び出されます。
  4. モデルは fireTableCellUpdated() を呼び出します。

ソリューションの実装

編集後にセルのレンダリングを維持するには、次の手順を実行します。必要:

  1. デフォルトのレンダラーを拡張します: 数値の書式設定を処理できるようにデフォルトのレンダラーを拡張する必要があります。これにより、レンダラーが値の表示を担当するようになります。
  2. レンダラーをエディター コンポーネントとして使用する: 場合によっては、レンダラーのインスタンスをエディターとして使用すると便利な場合があります。成分。これにより、表示された値と編集された値の両方に同じ書式設定を適用できます。

実装例

次に、デフォルトのエディターとレンダラーの実装を使用した基本的な例を示します。

import javax.swing.DefaultCellEditor;
import javax.swing.DefaultTableCellRenderer;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import java.text.NumberFormat;

public class RenderEditNumber {

    public static void main(String[] args) {
        NumberFormat nf = NumberFormat.getCurrencyInstance();
        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);
        table.setPreferredScrollableViewportSize(new Dimension(123, 123));
        table.setDefaultRenderer(Double.class, new CurrencyRenderer(nf));
        table.setDefaultEditor(Double.class, new CurrencyEditor(nf));
    }

    private static class CurrencyRenderer extends DefaultTableCellRenderer {

        private NumberFormat formatter;

        public CurrencyRenderer(NumberFormat formatter) {
            this.formatter = formatter;
            this.setHorizontalAlignment(JLabel.RIGHT);
        }

        @Override
        public void setValue(Object value) {
            setText((value == null) ? "" : formatter.format(value));
        }
    }

    private static class CurrencyEditor extends DefaultCellEditor {

        private NumberFormat formatter;
        private JTextField textField;

        public CurrencyEditor(NumberFormat formatter) {
            super(new JTextField());
            this.formatter = formatter;
            this.textField = (JTextField) this.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;
        }
    }
}
ログイン後にコピー

この例では、CurrencyRenderer クラスと CurrencyEditor クラスはそれぞれ、デフォルトのレンダラーとエディターの実装を次のように拡張します。数値の書式設定をハンドルします。この例には、JTable によって内部的に処理される fireTableCellUpdated() 呼び出しが含まれていないことに注意してください。

以上がセル編集後に JTable セルのレンダリングを維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート