В ListTransferHandler в DropDemo есть ошибка - PullRequest
1 голос
/ 04 марта 2011

это репост с OTN Дискуссионного форума , потому что я не получил там ответа.

В Java я хотел бы включить Drag and Drop в JList, содержащем строки. Для этого я использовал ListTransferHandler.java, который используется в Oracle DropDemo. К сожалению, в этом ListTransferHandler.java есть ошибка.

Чтобы воспроизвести ошибку в ListTransferHandler.java, я сделал следующее:

Вместо этого:

  • Элемент списка 1
  • Элемент списка 0

Я получаю это:

  • Элемент списка 1
  • Элемент списка 1

, что явно не является ожидаемым результатом.

Окно вывода Netbeans не показывало никаких сообщений об ошибках. Я пытался найти ошибку самостоятельно, но безуспешно.

Так я упускаю момент включения DnD в JList? Разве я не должен сам реализовать ListTransferHandler?

Кто-нибудь имеет рабочий ListTransferHandler для меня, пожалуйста, или знаете, как исправить тот, который используется в демо?

Спасибо и всего наилучшего, Kurt

Ответы [ 2 ]

0 голосов
/ 07 марта 2011

@ n0weak благодаря вашему ответу я мог бы исправить ListTransferHandler для своих нужд (несколько вариантов выбора все еще не работают, и я не тестировал другие режимы, кроме INSERT).

Я счел необходимым запомнить addIndex в дополнение к вашему решению выше.Вот изменения кода, которые я использовал:

public class ListTransferHandler extends TransferHandler {
    // ...
    private boolean insert;
    // ...

public boolean importData(TransferHandler.TransferSupport info) {
        // ...            
        // method local variables were mistakenly used
        insert = dl.isInsert();
        addIndex = dl.getIndex(); // also replace index with addIndex a few lines below
        addCount = indices.length;
        // ...

protected void exportDone(JComponent c, Transferable data, int action) {
        cleanup(c, insert && action == TransferHandler.MOVE);
    }

/* protected void importString(JComponent c, String str) {...} 
   This method is never called */
0 голосов
/ 04 марта 2011

Это определенно ошибка. Взгляните на метод ListTransferHandler # cleanup . Его цель - удалить ранее выбранный элемент из списка. Коррекция индексов выполняется перед удалением:

        if (addCount > 0) {
            for (int i = 0; i < indices.length; i++) {
                if (indices[i] > addIndex) {
                    indices[i] += addCount;
                }
            }
        }

Так или иначе, метод ListTransferHandler # importString , который инициализирует addCount , никогда не вызывается, следовательно, исправление никогда не выполняется.

В качестве обходного пути вы можете инициализировать его самостоятельно:

        int addCount = indices.length;

Это исправит INSERT Режим отбрасывания.

UPD:

Только что заметил, что другие режимы сброса тоже не работают Итак, окончательное исправление (похоже, так):

public class ListTransferHandler extends TransferHandler {
    private boolean insert;
    //........
    public boolean importData(TransferHandler.TransferSupport info) {
        //......
        insert = dl.isInsert();
        //......

    protected void exportDone(JComponent c, Transferable data, int action) {
        cleanup(c, insert && action == TransferHandler.MOVE);
    }

    protected void cleanup(JComponent c, boolean remove) {
        if (remove && indices != null) {
            int addCount = indices.length;
        //.....

}

Также следует удалить все неиспользуемые поля и методы.

...