JList: Reihenfolge der Elemente per Drag'n'Drop ändern.

Status
Nicht offen für weitere Antworten.

phiLue

Mitglied
Hallo :)

Also ich bin neu hier im Forum und hab mich wegen nem Problem welches ich hab hier angemeldet. Ich versuch mich jetzt nun schon recht lange daran eine JList welche mit Objekten des Typs JLabel befüllt ist per Drag'n'Drop von den Elementen her in der Reihenfolge zu verschieben.

Wichtig ist das ich nicht einfach nur den Text kopieren kann weil das JLabel auch ein Bild enthält.

Im Forum hab ich mich auch schon eine Zeit lang umgeguckt, und auch ein paar Sachen gefunden, aber entweder haben Sie nicht das Problem beschrieben was ich hatte oder ich bekam den Fehler "Page not found".

Gegoogelt hab ich natürlich auch schon und auch mehrere Beispiele versucht, welche mich aber letzendlich immer wieder in eine Sackgasse gebracht haben.

Ich hoffe ich werde hier fündig und einer von euch kann mir das anhand eines Beispiels etwas genauer erklären. :)

Vielen Dank schon einmal im voraus. :)
 

Ebenius

Top Contributor
Das macht ja richtig Spaß. Ich hoffe, damit kannst Du was anfangen:
Java:
/* (@)JListDnDFun.java */

/* Copyright 2009 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.Arrays;
import java.util.Stack;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.border.SoftBevelBorder;

/**
 * Test application for list DnD.
 * 
 * @author Sebastian Haufe
 */
public class JListDnDFun {

  /**
   * Model bound data flavor.
   * 
   * @author Sebastian Haufe
   */
  static class ListMoveDataFlavor extends DataFlavor {

    private final DefaultListModel model;

    public ListMoveDataFlavor(DefaultListModel model) {
      super(ListMoveTransferData.class, "List Data");
      this.model = model;
    }

    public DefaultListModel getModel() {
      return model;
    }

    @Override
    public int hashCode() {
      final int prime = 31;
      int result = super.hashCode();
      result = prime * result + ((model == null) ? 0 : model.hashCode());
      return result;
    }

    @Override
    public boolean equals(DataFlavor that) {
      if (this == that) {
        return true;
      }
      if (!super.equals(that) || getClass() != that.getClass()) {
        return false;
      }
      return match(model, that);
    }

    /**
     * Tests whether the given data flavor is a {@link ListMoveDataFlavor} and
     * matches the given model.
     * 
     * @param model the model
     * @param flavor the flavor
     * @return {@code true} if matches
     */
    public static boolean match(DefaultListModel model, DataFlavor flavor) {
      return flavor instanceof ListMoveDataFlavor
            && ((ListMoveDataFlavor) flavor).getModel() == model;
    }
  }

  /**
   * Model bound and index based transfer data.
   * 
   * @author Sebastian Haufe
   */
  private static class ListMoveTransferData {

    private final DefaultListModel model;
    private final int[] indices;

    ListMoveTransferData(DefaultListModel model, int[] indices) {
      this.model = model;
      this.indices = indices;
    }

    int[] getIndices() {
      return indices;
    }

    public DefaultListModel getModel() {
      return model;
    }
  }

  /**
   * Model bound transferable implementation.
   * 
   * @author Sebastian Haufe
   */
  static class ListMoveTransferable implements Transferable {

    private final ListMoveTransferData data;

    public ListMoveTransferable(ListMoveTransferData data) {
      this.data = data;
    }

    public DataFlavor[] getTransferDataFlavors() {
      return new DataFlavor[] { new ListMoveDataFlavor(data.getModel()) };
    }

    public boolean isDataFlavorSupported(DataFlavor flavor) {
      return ListMoveDataFlavor.match(data.getModel(), flavor);
    }

    public Object getTransferData(DataFlavor flavor)
          throws UnsupportedFlavorException, IOException {
      if (!isDataFlavorSupported(flavor)) {
        throw new UnsupportedFlavorException(flavor);
      }
      return data;
    }
  }

  /**
   * List transfer handler.
   * 
   * @author Sebastian Haufe
   */
  static class ListMoveTransferHandler extends TransferHandler {

    /** Serial version UID */
    private static final long serialVersionUID = 6703461043403098490L;

    @Override
    public int getSourceActions(JComponent c) {
      final JList list = (JList) c;
      return list.getModel() instanceof DefaultListModel ? MOVE : NONE;
    }

    @Override
    public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
      if (!(comp instanceof JList)
            || !(((JList) comp).getModel() instanceof DefaultListModel)) {
        return false;
      }

      final DefaultListModel model =
            (DefaultListModel) ((JList) comp).getModel();
      for (DataFlavor f : transferFlavors) {
        if (ListMoveDataFlavor.match(model, f)) {
          return true;
        }
      }
      return false;
    }

    @Override
    protected Transferable createTransferable(JComponent c) {
      final JList list = (JList) c;
      final int[] selectedIndices = list.getSelectedIndices();
      return new ListMoveTransferable(new ListMoveTransferData(
            (DefaultListModel) list.getModel(), selectedIndices));
    }

    @Override
    public boolean importData(TransferHandler.TransferSupport info) {
      final Component comp = info.getComponent();
      if (!info.isDrop() || !(comp instanceof JList)) {
        return false;
      }
      final JList list = (JList) comp;
      final ListModel lm = list.getModel();
      if (!(lm instanceof DefaultListModel)) {
        return false;
      }

      final DefaultListModel listModel = (DefaultListModel) lm;
      final DataFlavor flavor = new ListMoveDataFlavor(listModel);
      if (!info.isDataFlavorSupported(flavor)) {
        return false;
      }

      final Transferable transferable = info.getTransferable();
      try {
        final ListMoveTransferData data =
              (ListMoveTransferData) transferable.getTransferData(flavor);

        // get the initial insertion index
        final JList.DropLocation dropLocation = list.getDropLocation();
        int insertAt = dropLocation.getIndex();

        // get the indices sorted (we use them in reverse order, below)
        final int[] indices = data.getIndices();
        Arrays.sort(indices);

        // remove old elements from model, store them on stack
        final Stack<Object> elements = new Stack<Object>();
        int shift = 0;
        for (int i = indices.length - 1; i >= 0; i--) {
          final int index = indices[i];
          if (index < insertAt) {
            shift--;
          }
          elements.push(listModel.remove(index));
        }
        insertAt += shift;

        // insert stored elements from stack to model
        final ListSelectionModel sm = list.getSelectionModel();
        try {
          sm.setValueIsAdjusting(true);
          sm.clearSelection();
          final int anchor = insertAt;
          while (!elements.isEmpty()) {
            listModel.insertElementAt(elements.pop(), insertAt);
            sm.addSelectionInterval(insertAt, insertAt++);
          }
          final int lead = insertAt - 1;
          if (!sm.isSelectionEmpty()) {
            sm.setAnchorSelectionIndex(anchor);
            sm.setLeadSelectionIndex(lead);
          }
        } finally {
          sm.setValueIsAdjusting(false);
        }
        return true;
      } catch (UnsupportedFlavorException ex) {
        return false;
      } catch (IOException ex) {
        // FIXME: Logging
        return false;
      }
    }
  }

  // -------------------------------------------------------------------------
  // Program Entry Point
  // -------------------------------------------------------------------------

  /**
   * Test main method.
   * 
   * @param args ignored
   */
  public static void main(String[] args) {
    final DefaultListModel lm1 = new DefaultListModel();
    final DefaultListModel lm2 = new DefaultListModel();
    for (Object o : new Object[] { "A", "B", "C", "D", "E", "F", "G", "H" }) {
      lm1.addElement(o);
      lm2.addElement(o);
    }
    final JComponent sp1 = createListAndScrollPane(lm1);
    final JComponent sp2 = createListAndScrollPane(lm2);
    final JComponent sp3 = createListAndScrollPane(lm2);

    final JPanel indiPanel = new JPanel(new BorderLayout(6, 6));
    indiPanel.add(sp1, BorderLayout.CENTER);
    indiPanel.setBorder(BorderFactory.createTitledBorder(new SoftBevelBorder(
          BevelBorder.LOWERED), "Independent Model"));

    final JPanel sharedPanel = new JPanel(new GridLayout(1, 0, 6, 6));
    sharedPanel.add(sp2);
    sharedPanel.add(sp3);
    sharedPanel.setBorder(BorderFactory.createTitledBorder(
          new SoftBevelBorder(BevelBorder.LOWERED), "Shared Model"));

    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(indiPanel, BorderLayout.LINE_START);
    contentPane.add(sharedPanel, BorderLayout.CENTER);

    final JFrame f = new JFrame("Test Frame: List DnD Fun"); //$NON-NLS-1$
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

  private static JScrollPane createListAndScrollPane(DefaultListModel model) {
    final JList list = new JList(model);
    list.setDragEnabled(true);
    list.setDropMode(DropMode.INSERT);
    list.setTransferHandler(new ListMoveTransferHandler());
    list.setPrototypeCellValue("WWWWWWWWWWWWWWWWWW");
    final JScrollPane sp = new JScrollPane(list);
    return sp;
  }
}
Ebenius
 
Zuletzt bearbeitet:

phiLue

Mitglied
Vielen herzlichen Dank, genau sowas hab ich gesucht. Bin sehr gut mit dem Quellcode klar gekommen, auch wenn es am Anfang recht verwirrend aussah.

Bei mir klappt nun alles einwand frei, danke nochmal, war wirklich am verzweifeln. :)
 

Ebenius

Top Contributor
Ebenius du bist verrückt ;):D:toll:
Wieso bin ich verrückt? Ich bin nur hauptberuflich Java-Entwickler, der 90% seiner Zeit mit Swing zubringt. Die Lösung oben hat mich zwei Stunden gekostet, ich hab was gelernt, und hab's heute schon in ähnlicher Form in eines unserer Produkte eingebaut (was leider etwas schwieriger war, weil es in JRE 5 noch keine DropLocations gibt).

Sport frei!

Ebenius
 

André Uhres

Top Contributor
So ist's auch lustig :D (zum Verschieben einzelner Zeilen):
Java:
MouseInputAdapter mouseHandler = new MouseInputAdapter() {
    private Object draggedObject;
    private int fromIndex;
    public void mousePressed(final MouseEvent evt) {
        draggedObject = list.getSelectedValue();
        fromIndex = list.getSelectedIndex();
    }
    public void mouseDragged(final MouseEvent evt) {
        int toIndex = list.locationToIndex(evt.getPoint());
        if (toIndex != fromIndex) {
            model.removeElementAt(fromIndex);
            model.insertElementAt(draggedObject, toIndex);
            fromIndex = toIndex;
        }
    }
};
list.addMouseListener(mouseHandler);
list.addMouseMotionListener(mouseHandler);
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Du single selection im SelectionModel, oder? Funktioniert das auch mit single/multi interval selection?

Ebenius
 

André Uhres

Top Contributor
Ich habe mein Beispiel vielleicht schlecht beschrieben. Ich meinte, daß immer nur einzelne Zeilen verschoben werden, d.h. nur die angeklickte Zeile wird jeweils verschoben. Auf diese Funktion bezogen ist der SelectionMode egal.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Jlist füllen AWT, Swing, JavaFX & SWT 4
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
BananenBrötchen Swing Arraylist in jList anzeigen AWT, Swing, JavaFX & SWT 6
J Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
G Eingabe in JTextField in Array speichern und in JList ausgeben AWT, Swing, JavaFX & SWT 7
cezary Choice, JComboBox oder JList AWT, Swing, JavaFX & SWT 5
J JList scrollen AWT, Swing, JavaFX & SWT 3
Neumi5694 Swing JList - Klick abfangen AWT, Swing, JavaFX & SWT 3
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
M Swing JList Auswahl-GUI-Konzept AWT, Swing, JavaFX & SWT 9
C JList: Bestimmte Objekte ausschließen AWT, Swing, JavaFX & SWT 1
F JList aktualisiert nicht AWT, Swing, JavaFX & SWT 24
F JList auffüllen aus Array von Instanzen AWT, Swing, JavaFX & SWT 4
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
F JList bei Windowbuilder AWT, Swing, JavaFX & SWT 8
F JList zeigt keine Einträge mehr AWT, Swing, JavaFX & SWT 1
P JList erstellen AWT, Swing, JavaFX & SWT 4
G DefaultListModel für JList AWT, Swing, JavaFX & SWT 2
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
P Übergeben von ListModel an nichtparametrisierte JList AWT, Swing, JavaFX & SWT 8
M Ein Element in mehreren JList selektieren AWT, Swing, JavaFX & SWT 5
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
Nabbit Über JList kein JPopupMenu AWT, Swing, JavaFX & SWT 2
O Swing JList beim Klicken in der GUI erstellen AWT, Swing, JavaFX & SWT 6
C Swing JList zeigt keine neuen Einträge an AWT, Swing, JavaFX & SWT 1
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
T Generische Klasse in JList über DefaultListModel AWT, Swing, JavaFX & SWT 1
T Swing WindowBuilder: JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
C Hilfe bei JSpinner und JList AWT, Swing, JavaFX & SWT 1
D Swing ArrayList in Jlist/ List oder Array in JList/List AWT, Swing, JavaFX & SWT 5
S JList ist leer, aber DefaultListModel hat die Daten? AWT, Swing, JavaFX & SWT 9
M JList wird angezeigt, JTable (DefaultTableModel) nicht AWT, Swing, JavaFX & SWT 7
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
D Swing Jlist Größe während der Laufzeit verändern. AWT, Swing, JavaFX & SWT 11
Q JList Update Problem AWT, Swing, JavaFX & SWT 1
W Sichtbarer Bereich JScrollPane vs. JList AWT, Swing, JavaFX & SWT 3
N AWT Markierte Zeile jList aus mySQL DB löschen AWT, Swing, JavaFX & SWT 2
S JList repaint AWT, Swing, JavaFX & SWT 1
F Swing JTextField in JList (Funktion beibehalten) AWT, Swing, JavaFX & SWT 2
H JList AWT, Swing, JavaFX & SWT 5
B Swing Bild von Webseite herunterladen, diese dann in JList anzeigen. AWT, Swing, JavaFX & SWT 1
B Swing Dynamische JList mit Bildern AWT, Swing, JavaFX & SWT 4
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
S JList Index finden AWT, Swing, JavaFX & SWT 6
3 Swing JList-Inhalt als verschlüsselte Datei schreiben und lesen AWT, Swing, JavaFX & SWT 1
N JComponenten in JList oder doch anders? AWT, Swing, JavaFX & SWT 0
S Swing JList, ArrayList + DefaultModel AWT, Swing, JavaFX & SWT 5
B Tabelleneinträge in JList anzeigen AWT, Swing, JavaFX & SWT 5
P JList/JScroolPane Text verschieben und text wrappen AWT, Swing, JavaFX & SWT 3
D Swing JList keine Selektionsänderung bei "dragged-Maus" AWT, Swing, JavaFX & SWT 4
M JList Model filtern AWT, Swing, JavaFX & SWT 4
K Swing JList - Element richtig hinzufügen AWT, Swing, JavaFX & SWT 4
T Swing Elemente der JList überlappend darstellen AWT, Swing, JavaFX & SWT 5
P Swing JList mit Objekten - Name anzeigen AWT, Swing, JavaFX & SWT 5
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
K Mehrfachselektierungen in einer JList AWT, Swing, JavaFX & SWT 6
L Swing Component alignment innerhalb einer JList AWT, Swing, JavaFX & SWT 3
M Swing JList Listener AWT, Swing, JavaFX & SWT 20
M Accelerator zu JMenuItem des JPopupMenu einer JList AWT, Swing, JavaFX & SWT 2
S Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Element aus JList eines JFileChooser entfernen AWT, Swing, JavaFX & SWT 3
E selektierter Datensatz in JList als String Datentyp AWT, Swing, JavaFX & SWT 23
E selektiertes Element aus JList zurückgeben AWT, Swing, JavaFX & SWT 7
E JList /DefaultListModel mit Datenbank verbinden AWT, Swing, JavaFX & SWT 10
L SQL & Jtable o. JList AWT, Swing, JavaFX & SWT 5
K Swing JList und veränderte CellRenderer AWT, Swing, JavaFX & SWT 8
B JList + ListCellRenderer AWT, Swing, JavaFX & SWT 5
B JList -> Disabled AWT, Swing, JavaFX & SWT 6
J JList, Anzeige aktualisieren AWT, Swing, JavaFX & SWT 7
I Jlist isselectionEmpty AWT, Swing, JavaFX & SWT 4
I Jlist dynamisch aus Datenbank füllen AWT, Swing, JavaFX & SWT 14
R Swing unbegrenzte Anzahl vonEinträgen in JList AWT, Swing, JavaFX & SWT 2
MiMa Dateien aus Ordner in einer JList Ausgeben AWT, Swing, JavaFX & SWT 32
P Elemente einer JList ausgeben AWT, Swing, JavaFX & SWT 11
M JList mit 2-zeiligen Objekten füllen AWT, Swing, JavaFX & SWT 7
S JList mit Einträgen versehen schlägt fehl AWT, Swing, JavaFX & SWT 4
F Swing ArrayList in JList anzeigen und Objekte auswählen AWT, Swing, JavaFX & SWT 2
B JList zeigt Elemente nicht an AWT, Swing, JavaFX & SWT 3
S Fragen zu JList AWT, Swing, JavaFX & SWT 3
B Aktualisierung einer JList AWT, Swing, JavaFX & SWT 5
W JList valueChanges weiterleiten? AWT, Swing, JavaFX & SWT 14
D JButton-Click in JList mit Panels (auf dem der Button ist) AWT, Swing, JavaFX & SWT 6
E Jlist nur mit Klasse? AWT, Swing, JavaFX & SWT 5
D Swing JList <-> AdapterModel <-> Model AWT, Swing, JavaFX & SWT 4
1 JList - Elemente mit rechter Maustaste wählen AWT, Swing, JavaFX & SWT 6
M JList mit DefaultListModel und listener AWT, Swing, JavaFX & SWT 4
B JList nach dem Rendern sortieren AWT, Swing, JavaFX & SWT 3
T Wie ist das "Lookup-Verhalten" von JList, JCombobox änderbar? AWT, Swing, JavaFX & SWT 4
D JList items voneinander trennen AWT, Swing, JavaFX & SWT 10
E Keine Ausgabe von JList bei drücken von Button auf die Konsole AWT, Swing, JavaFX & SWT 7
M gleiches Element in JList mehrmals hintereinander auswählen AWT, Swing, JavaFX & SWT 6
T JList und Objekte AWT, Swing, JavaFX & SWT 7
M Swing JList Item in andere JList während Ausführung AWT, Swing, JavaFX & SWT 4
V JList filtern AWT, Swing, JavaFX & SWT 6
GianaSisters jList nur einmal ein Element anklicken AWT, Swing, JavaFX & SWT 3
TheWhiteShadow JList-Inhalt nach Änderung weg AWT, Swing, JavaFX & SWT 3
T JList ruft getElementAt nicht mehr auf AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben