2

カスタムオブジェクトをJLabelにドラッグアンドドロップしていて、転送プロセス中にオブジェクトを参照できます(ラベルStringを受信したオブジェクトtoStringに変更します)が、カスタムオブジェクトを実際にJLabelに格納する方法やビルドする方法がわかりません参照。

転送プロセス中にこれを達成するための最良の方法は何ですか?

これは、オブジェクトを受け取り、それを使用してテキストを設定する作業転送コードです(以前の回答のおかげで:ここ

public boolean importData(TransferSupport support) {
            boolean accept = false;
            if (canImport(support)) {
                try {
                    Transferable t = support.getTransferable();
                    Object value = t.getTransferData(PersonTransferable.PERSON_FLAVOR);
                    if (value instanceof Person) {
                        Component component = support.getComponent();
                        if (component instanceof JLabel) {
                            ((JLabel)component).setText(((Person)value).toString());
                            //action here

                        }
                    }
                } catch (Exception exp) {
                    exp.printStackTrace();
                }
            }
            return accept;
        }

JLabelには、保存したい特定のインスタンス変数があります。コンポーネント(JLabel)と値(カスタムオブジェクト)があるので、このリンクを作成できますか?

最悪のシナリオでは、ラベルごとにTransferHandlerを作成し、値を正確に参照する必要があります。とにかく、これはおそらくベストプラクティスですか?

4

1 に答える 1

5

あなたは私が見ることができるいくつかの選択肢があります

選択肢#1

Mapある種のオブジェクトを作成し、ラベルをキーとして使用して、ラベルに対してオブジェクトを保存します

Map<JLabel, Person> mapPeople = new HashMap<JLable, Person>(25)

次に、インポート方法で

mapPeople.put((JLabel)component, (Person)value);

選択肢#2

を利用してput/getClientProperty、名前付きキーに対して値を格納します...

インポート方法では...

((JLabel)component).putClientProperty("person", value);

そして、あなたが再びそれを必要とするとき

Person person =(Person)label.getClientProperty( "person");

選択肢#3

人を直接参照できるカスタムラベルを作成します。

public class PersonLabel extends JLabel {
    private Person person;
    public void setPerson(Person person) {
        this.person = person;
        setText(person == null ? null : person.toString());
    }

    public Person getPerson() {
        return person;
    }
}

基本的に、通常の代わりにこのコンポーネントを使用しJLabelます。正しくキャストするようにしてください。

このほとんどを最初に言及したのは、Hovercraftとtrashgodの功績です。

最終的な選択

最終的な選択は、独自の設計、要件、およびソリューションをどの程度再利用可能にするかによって決まります。

これがアプリケーションの「1回限りの」要件である場合、Mapおよびクライアントプロパティは妥当なソリューションです。

Map他の開発者にとってより目立ちやすく、あなたが何をしようとしているのかは明らかです。ただし、混乱するのは簡単です。誰かが要件に従うのを忘れた、または知らなかったために、マップに無関係なデータが含まれているか、データが欠落している。

これclientPropertyは、この意味でのいくつかの欠点を解決Mapします。これは、コンポーネントではなく単一のコンポーネントを処理しているためですMap(ただし、開発者はプロパティの設定を忘れることができます)が、比較すると可視性がはるかに低くなります。にMap。開発者がデータの保存/取得方法を理解するのに時間がかかる場合があります。

ただし、シンプルであるという利点があります。ラベルへの参照を渡すことができ、ラベルだけでなく、ラベルも持つことができPersonます。

カスタムラベルは、柔軟性の機会を提供します。clientPropertyパブリックメソッドを定義しているので、ソリューションよりも明白です。またTransferHandler、ソリューションを再利用するたびにラベルを個別に設定するのではなく、ラベルの作成時に設定する機会も得られます。

結局のところ、これです。迅速で一度の解決策が必要ですか、それとも自己完結型で再利用可能なものが必要ですか。MapおよびのclientProperty選択は、実装と使用が比較的迅速です。カスタムコンポーネントはもう少し手間がかかりますが、通常、より再利用可能なソリューションになります。それはすべてあなた次第です ;)

于 2012-12-13T20:32:14.307 に答える