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

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

DDD
リリース: 2024-12-06 07:17:11
オリジナル
556 人が閲覧しました

How to Maintain Custom JTable Cell Rendering After Editing?

レンダリング編集番号: セル編集後の JTable 形式の維持

カスタム セル レンダリングで JTable を拡張する場合、そのレンダリングを維持することが重要ですセル編集後。これには、セル レンダラー内の書式設定の保持が含まれます。

問題:

カスタム セル レンダラーで書式設定された JTable 列の JTextField エディタを実装した後、セルのカスタムが失われます。編集時のレンダリング

解決策:

セル値の変更時にモデルがレンダラーを更新しないため、書式設定の損失が発生します。これを修正するには、テーブル モデルの変更後にセル レンダラーが必ず呼び出されるようにします。

実装:

  • 必要な書式設定を処理できるようにデフォルトのレンダラーを拡張します (例: CurrencyRenderer)。
  • デフォルトのエディタを拡張します (例: CurrencyEditor) を作成し、値を編集およびレンダリングするための getCellEditorValue() メソッドと getTableCellEditorComponent() メソッドを実装します。
  • テーブル内の getTableCellEditorComponent() メソッド (たとえば、editingStopped()) をオーバーライドして、エディターでテキストが確実に選択されるようにします。
  • この例では、CurrencyRenderer クラスと CurrencyEditor クラスがJTable で通貨の書式設定を処理します。セルを編集すると、値は正しく解析、書式設定され、レンダリングされます。

サンプル コード:

提供されているサンプル コードは、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 サイトの他の関連記事を参照してください。

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