2

a の「ドロップ」イベントJListをその親 ( JPanel) に委譲し、JList でのドロップの視覚的なフィードバックを削除したいと考えています。

これを行う正しい方法は何ですか?

オブジェクトを作成しDropTarget、JPanel と JList の間で共有しようとしていますが、少しハックなようです --- 何をすべきか理解できず、問題が発生するのではないDropTarget.getComponent()かと心配しています。

これを行う正しい方法をアドバイスできますか(Java 6で)?

編集: *なぜ私はこれをしているのですか? *

ユーザーがアイテムをグループに入れられるようにしようとしています (1 つの JPanel + 1 つの JList = 1 つのグループ) -- アイテムがドロップされると、リストの順序は保持されません (内部データ構造のために保持できません)。JList。_

のデフォルトの視覚的フィードバックJListは、追加される場所を示唆する線のようなカーソルです。デフォルトを使用すると、カーソルが表示されている場所ではなく、リストの最後にアイテムが追加されていることに気付いたときに、ユーザーは混乱します。

視覚的なフィードバックを簡単に見せるために、JPanel レベル (1 つの JList に対して 1 つの JPanel、リストの上に半透明のオーバーレイなど) で行っています。当然、その JPanel にドロップすると、リストにも追加されます。そう....

4

2 に答える 2

1

JList のドラッグ アンド ドロップ処理を保持する必要がない場合、これを実現する最も簡単な方法は、TransferHandler を null に設定することです。その親に TransferHandler が設定されていると仮定すると、ドラッグ & ドロップ イベントを自動的に処理できるようになります。

于 2012-02-22T08:41:43.993 に答える
1

ドロップ位置の視覚的なフィードバックは、セル レンダラーによって処理されます。削除する汚いトリックは、その点で何もしないカスタム レンダラーです (ロジックが完全ではないことに注意してください。おそらく、「実際の」選択ケースを処理する必要があります)。

    ListCellRenderer renderer = new DefaultListCellRenderer() {

        @Override
        public Component getListCellRendererComponent(JList list,
                Object value, int index, boolean isSelected,
                boolean cellHasFocus) {
            super.getListCellRendererComponent(list, value, index, isSelected,
                    cellHasFocus);
            JList.DropLocation dropLocation = list.getDropLocation();
            if (dropLocation != null
                    && !dropLocation.isInsert()
                    && dropLocation.getIndex() == index) {
                setBackground(list.getBackground());
                setForeground(list.getForeground());
            }
            return this;
        }

    };

リストとそれを含むパネルの両方にインストールされているカスタム transferHandler と組み合わせると、必要なものに非常に近いはずです (その importData で、リストの最後に項目を追加し、新しいエントリを選択してスクロールします)。

于 2012-01-27T12:20:38.627 に答える