ホームページ >Java >&#&チュートリアル >カスタム DataModel を使用すると、JTable 行に重複した値が表示されるのはなぜですか?

カスタム DataModel を使用すると、JTable 行に重複した値が表示されるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-31 08:29:11488ブラウズ

Why are my JTable rows showing duplicate values when using a custom DataModel?

行内の JTable 重複値

JTable にカスタム DataModel を設定すると、テーブルの行に重複データが予期せず表示されることがあります。 。これは DataModel に問題があることを示唆している可能性がありますが、詳しく調べると別のことが判明することが多く、この動作の原因は謎のままです。

この現象について考えられる説明の 1 つは、JTable 自体の実装にあります。 DataModel を使用して JTable にデータを設定すると、テーブルに表示される値は DataModel の getValueAt メソッドから直接導出されます。このメソッドがテーブル内の各セルの一意の値を正しく取得できない場合、表示される値は複数の行にわたって重複します。

この問題に対処するには、getValueAt メソッドが常に各セルの意図した値。これは、DataModel によって使用される基礎となるデータ構造を適切に設定することで実現できます。提供された DataModel の場合、populate メソッドはデータ ArrayList にデータの行を埋めます。ただし、この ArrayList に値を設定するコードが各行に一意の値を正しく割り当てていない場合、結果のテーブルには重複した値が表示されます。

注意: getValueAt メソッドを変更して個別の値を返すだけでは十分ではありません。これでは根本的な問題は修正されないため、値を変更します。代わりに、DataModel の設定に使用されるデータ構造に最初から正しいデータが含まれていることを確認することに重点を置く必要があります。データ ソースをアドレス指定することで、JTable に重複する値が表示されるのを防ぐことができます。

より具体的な例として、次のコード スニペットを考えてみましょう。

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

public class CollectionDataModel extends AbstractTableModel {
    private ArrayList<ArrayList<String>> data;

    public CollectionDataModel() {
        data = new ArrayList<ArrayList<String>>();
    }

    @Override
    public int getColumnCount() {
        if (data.isEmpty())
            return 0;
        return data.get(0).size();
    }

    @Override
    public int getRowCount() {
        return data.size();
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        if (rowIndex >= getRowCount())
            return null;
        if (columnIndex >= getColumnCount())
            return null;
        return data.get(rowIndex).get(columnIndex);
    }

    public void populate(Collection c) {
        data.clear();
        for (Item i : c.getItems()) {
            ArrayList<String> row = new ArrayList<String>();
            for (Property p : i.getProperties().values()) {
                row.add(p.toString());
            }
            data.add(row);
        }
        fireTableDataChanged();
    }
}

このコードではの場合、populate メソッドは、Collection オブジェクトから取得したデータの行をデータ ArrayList に書き込みます。 JTable 内の値の重複を回避するには、ArrayList 内の各行に一意のデータが含まれていることを確認することが重要です。これは、ArrayList に新しい行を追加する前に重複データの存在をチェックするか、一意性を強制するデータ構造を採用することによって実現できます。

データ ソースを直接アドレス指定することで、重複した値が発生するのを防ぐことができます。 JTable に表示されます。このアプローチは、基礎となるデータが最初から正確であることを保証するため、getValueAt メソッドを操作するよりも信頼性が高く効率的です。

以上がカスタム DataModel を使用すると、JTable 行に重複した値が表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。