Перетаскивание для заказа элементов в Swing

У меня есть список элементов для отображения в Swing. Для простоты представьте, что каждый элемент состоит только из имени. Я хочу, чтобы пользователь мог заказывать эти элементы, перетаскивая их друг над другом/под ним. Каков наилучший способ добиться этого?

В качестве альтернативы, это может быть выполнено с помощью JList с кнопками «вверх» и «вниз», которые будут перемещать выбранный элемент вверх/вниз в списке. Это потребовало бы мгновенного обновления графического дисплея при каждом щелчке (я не знаю, как это сделать) и сохранения нового порядка, получая элементы в списке в их текущем порядке (что я также не знаю, как сделать ).

Или может быть решение с перетаскиванием более осуществимо?


person drew moore    schedule 11.03.2013    source источник
comment
не уверен, что это может вам помочь - stackoverflow.com/questions /13692357/   -  person Mohsin    schedule 12.03.2013
comment
Вы читали какие-либо учебные пособия или документы JavaDocs для Swing? java.sun.com/docs/books/tutorial/uiswing/ component/list.html Может быть, вы могли бы перечислить, что вы пробовали до сих пор, и что сработало, а что нет.   -  person Nathaniel Waisbrot    schedule 12.03.2013


Ответы (2)


Вероятно, было бы проще реализовать это с помощью решения JList, которое вы упомянули, поэтому я дам вам несколько советов по этому поводу (я не очень разбираюсь в D&D).

По сути, вы хотите иметь три компонента: JList и два (один вверх, один вниз) JButton. Вам также, вероятно, понадобится настраиваемая модель списка. Если вы не знакомы с моделями или моделями списков, ознакомьтесь с этим руководством. В противном случае читайте дальше.

В классе модели списка (например, ReorderableListModel) определите два метода: public void moveUp(int index) и public void moveDown(int index).

Код для moveUp выглядит следующим образом:

if (index > 0) { // error checking
    // Swap the given index with the previous index.
    // (where `list` is the name of your list variable)
    Collections.swap(list, index, index - 1);
}
// Finally, notify the `JList` that the list structure has changed.
fireContentsChanged(this, index - 1, index);

moveDown похоже:

if (index < getSize() - 1) {
    Collections.swap(list, index, index + 1);
}
fireContentsChanged(this, index, index + 1);

Теперь нам нужно реализовать прослушиватели действий для кнопок. Для кнопки вверх попробуйте этот код слушателя:

// First, move the item up in the list.
listModel.moveUp(list.getSelectedIndex());

// Now, set the selection index to keep the same item selected.
//
// If you use the default list selection interval, setting the index to -1
// will do nothing (so it's okay, we don't need error checking here).
list.setSelectedIndex(list.getSelectedIndex() - 1);

Добавьте аналогичный метод «движения вниз», и все готово!

Что касается «мгновенного обновления графического отображения при каждом щелчке», это то, что делает метод fireContentsChanged в классе модели. JList сделает обновление за вас.

person wchargin    schedule 11.03.2013

Это функциональность, которую трудно достичь, используя только свинг. Вы слышали о JavaFX? Это отличный графический фреймворк, с которым можно работать, если вы хотите добиться более динамичной функциональности в настольных приложениях. Ознакомьтесь с этой статьей: http://docs.oracle.com/javase/tutorial/uiswing/dnd./index.html

Здесь вы сможете найти ссылки с дополнительной информацией, а также несколько примеров. С наилучшими пожеланиями.

person Marcelo Tataje    schedule 11.03.2013
comment
В своем блоге Нараян подробно описывает решение для с помощью перетаскивания, чтобы упорядочить элементы с помощью JavaFX ListView. - person jewelsea; 12.03.2013