Mam JList i chcę, aby użytkownik mógł zmienić kolejność elementów na liście za pomocą metody przeciągnij i upuść (używając mojego własnego ListModelu i ListCellRenderer, jeśli to robi jakąkolwiek różnicę). Jakie obiekty muszę utworzyć i jak przetworzyć to działanie?Jak włączyć przeciąganie i upuszczanie wewnątrz JList
8
A
Odpowiedz
1
Jak o coś takiego:
DefaultListModel<String> myListModel = createStringListModel();
JList<String> myList = new JList<String>(myListModel);
MyMouseAdaptor myMouseAdaptor = new MyMouseAdaptor();
myList.addMouseListener(myMouseAdaptor);
myList.addMouseMotionListener(myMouseAdaptor);
private class MyMouseAdaptor extends MouseInputAdapter {
private boolean mouseDragging = false;
private int dragSourceIndex;
@Override
public void mousePressed(MouseEvent e) {
dragSourceIndex = myList.getSelectedIndex();
}
@Override
public void mouseReleased(MouseEvent e) {
if (mouseDragging) {
int dragTargetIndex = myList.getSelectedIndex();
String dragElement = myListModel.get(dragSourceIndex);
myListModel.remove(dragSourceIndex);
myListModel.add(dragTargetIndex, dragElement);
}
mouseDragging = false;
}
@Override
public void mouseDragged(MouseEvent e) {
mouseDragging = true;
}
}
private DefaultListModel<String> createStringListModel() {
final String[] listElements = new String[] { "Cat", "Dog", "Cow", "Horse", "Pig", "Monkey" };
DefaultListModel<String> listModel = new DefaultListModel<String>();
for (String element : listElements) {
listModel.addElement(element);
}
return listModel;
}
5
Modified Jan Taccis odpowiedź:
public class DndTest extends JFrame {
JList<String> myList;
DefaultListModel<String> myListModel;
public DndTest() {
myListModel = createStringListModel();
myList = new JList<String>(myListModel);
MyMouseAdaptor myMouseAdaptor = new MyMouseAdaptor();
myList.addMouseListener(myMouseAdaptor);
myList.addMouseMotionListener(myMouseAdaptor);
JPanel content = new JPanel();
content.add(myList);
this.add(content);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);
}
private class MyMouseAdaptor extends MouseInputAdapter {
private boolean mouseDragging = false;
private int dragSourceIndex;
@Override
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
dragSourceIndex = myList.getSelectedIndex();
mouseDragging = true;
}
}
@Override
public void mouseReleased(MouseEvent e) {
mouseDragging = false;
}
@Override
public void mouseDragged(MouseEvent e) {
if (mouseDragging) {
int currentIndex = myList.locationToIndex(e.getPoint());
if (currentIndex != dragSourceIndex) {
int dragTargetIndex = myList.getSelectedIndex();
String dragElement = myListModel.get(dragSourceIndex);
myListModel.remove(dragSourceIndex);
myListModel.add(dragTargetIndex, dragElement);
dragSourceIndex = currentIndex;
}
}
}
}
private DefaultListModel<String> createStringListModel() {
final String[] listElements = new String[] { "Cat", "Dog", "Cow", "Horse", "Pig", "Monkey" };
DefaultListModel<String> listModel = new DefaultListModel<String>();
for (String element : listElements) {
listModel.addElement(element);
}
return listModel;
}
public static void main(String[] args) {
new DndTest();
}
}
0
W następującej metody jest błąd logiczny w nim bo jak tylko przycisk myszy zostanie zwolniony, przeciąganie musi zostać zatrzymane. W języku jawnym warunek IF musi zostać zanegowany po prostu
@Override
public void mouseReleased(MouseEvent e) {
if (!mouseDragging) {
int dragTargetIndex = myList.getSelectedIndex();
String dragElement = myListModel.get(dragSourceIndex);
myListModel.remove(dragSourceIndex);
myListModel.add(dragTargetIndex, dragElement);
}
mouseDragging = false;
}
Powiązane problemy
- 1. Niestandardowe przeciąganie i upuszczanie Java w JPanel
- 2. Przeciąganie i upuszczanie * FROM * przeglądarki?
- 3. Jak zaimplementować przeciąganie i upuszczanie w Angular2?
- 4. Przeciąganie i upuszczanie dynamicznie utworzonego skrótu
- 5. Przeciąganie i upuszczanie IOS między widokami przewijania
- 6. Przeciąganie i upuszczanie obrazów z galerii Android
- 7. Proste przeciąganie i upuszczanie do widoku?
- 8. Przeciąganie i upuszczanie plików na NSTableView?
- 9. PyQT4: Przeciąganie i upuszczanie plików do QListWidget
- 10. Przeciąganie i upuszczanie zdarzeń w osadzonym SVG?
- 11. HTML5 Przeciąganie i upuszczanie (DnD): zmiana kursora
- 12. Przeciąganie i upuszczanie WPF między kontenerami
- 13. Przeciąganie i upuszczanie bez przenoszenia elementu
- 14. jstree węzeł ograniczający przeciąganie i upuszczanie przed i po root
- 15. jQuery: Jak mogę symulować przeciąganie i upuszczanie w kodzie?
- 16. Jak symulować przeciąganie i upuszczanie HTML5 w Selenium Webdriver?
- 17. Akceptuj przeciąganie i upuszczanie obrazu z innego okna przeglądarki
- 18. WPF: Zmienianie kolejności zawartości WrapPanel poprzez przeciąganie i upuszczanie?
- 19. HTML5: Przeciąganie/upuszczanie na osi X i bez zanikania?
- 20. Android - Przeciąganie i upuszczanie - cień animacji do miejsca docelowego
- 21. Przeciąganie i upuszczanie obrazów z przeglądarki Firefox na Microsoft Powerpoint
- 22. HTML5 Przeciąganie i upuszczanie - wykrywanie folderów w Safari (FileList, File)
- 23. Przeciąganie i upuszczanie problemów z pozycjonowaniem + aktualizowanie identyfikatora
- 24. Przeciąganie i upuszczanie obrazu z przeglądarki do aplikacji WPF
- 25. Plik Przeciąganie i upuszczanie w Firefoksie (wersja 10)
- 26. Html5 Przeciąganie i upuszczanie pozycji myszy w przeglądarce Firefox
- 27. Przeciąganie i upuszczanie plików do postaci Delphi nie działa
- 28. Przeciąganie i upuszczanie - czy można uzyskać adres URL?
- 29. Sortowalne przeciąganie i upuszczanie Jquery nie wyświetlające kursora "przesuwania"
- 30. Przeciąganie i upuszczanie z formularzy systemu Windows na pulpit i Eksplorator Windows