Swing Sortierte JList

Sundal

Mitglied
Hallo zusammen

Ich bin wirklich am verzweifeln und komme nicht weiter. Habe einen Quellcode welcher 2 JList auf einer Swing_form hat. Den Code habe ich so umgeschreiben, dass die JLists alphabetisch sortiert werden. Durch 'ADD' sollte ein Eintrag von der JList1 in die JList2 verschoben werden. Das Zufügen geht auch, aber der Eintrag wird in der alten JList dann jeweils nicht enfernt.

Kann mir jemand von Euch bei der Umschreibung des Codes helfen? Wäre sehr dankbar für Hilfestellungen und Tipps

Grüsse Sundal

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
 
import javax.activation.ActivationDataFlavor;
import javax.activation.DataHandler;
import javax.swing.AbstractListModel;
import javax.swing.DefaultListModel;
import javax.swing.DropMode;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.TransferHandler;


public class Sorted_JList extends JFrame
{
	private static final long serialVersionUID = 1L;
	 
	private Sorted_JList() {
		super("JList");	
		createContents();
	}
	   
	private void createContents() {
		
		SortedListModel left = new SortedListModel();
		SortedListModel right = new SortedListModel();
                       
        left.add("Schwarz");
        left.add("Orange");
        left.add("Rot");
        left.add("Blau");
        left.add("Grün");
        left.add("Weiss");
		JList list1 = new JList(left);
		JScrollPane scroll1 = new JScrollPane(list1);
        scroll1.setPreferredSize(new Dimension(200, 200));
        
        JButton buttonRight = new JButton("ADD");
        JButton buttonLeft = new JButton("REMOVE");
                       
        JList list2 = new JList(right);
        JScrollPane scroll2 = new JScrollPane(list2);
        scroll2.setPreferredSize(new Dimension(200, 200));
                       
		MoveItem actionMoveLeft = new MoveItem(list2, list1);
		MoveItem actionMoveRight = new MoveItem(list1, list2);
                       
		TransferHandler transferHandler = new ListItemTransferHandler();
                       
		list1.setDragEnabled(false);
		list1.setDropMode(DropMode.INSERT);
		list1.setTransferHandler(transferHandler);
		list1.addKeyListener(new ListKeyListener(list1, list2, 39));
                       
		list2.setDragEnabled(false);
		list2.setDropMode(DropMode.INSERT);
        list2.setBackground(Color.green);
		list2.setTransferHandler(transferHandler);
		list2.addKeyListener(new ListKeyListener(list2, list1, 37));
 
		buttonLeft.addActionListener(actionMoveLeft);
		buttonRight.addActionListener(actionMoveRight);
                       
		JPanel content = new JPanel(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();
		c.fill = GridBagConstraints.BOTH;
		c.weightx = 1.0;
		c.weighty = 1.0;
		c.gridx = 0;
		c.gridy = 0;
		c.gridheight = 2;
		c.insets = new Insets(5, 5, 5, 5);
		content.add(scroll1, c);
                       
		c.gridx = 2;
		content.add(scroll2, c);
 
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0.0;
		c.weighty = 0.0;
		c.gridx = 1;
		c.gridheight = 1;
		c.insets = new Insets(5, 0, 0, 0);
		content.add(buttonLeft, c);
		c.weightx = 0.0;
		c.weighty = 1.0;
		c.gridy = 1;
		c.anchor = GridBagConstraints.NORTH;
		content.add(buttonRight, c);
		setContentPane(content);
	}
           
	public static void main(String[] args) {
		JFrame window = new Sorted_JList();
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		window.pack();
		window.setLocationRelativeTo(null);
		window.setVisible(true);
	}
}
      
	class SortedListModel extends AbstractListModel {

		  SortedSet model;

		  public SortedListModel() {
		    model = new TreeSet();
		  }

		  public int getSize() {
		    return model.size();
		  }

		  public Object getElementAt(int index) {
		    return model.toArray()[index];
		  }

		  public void add(Object element) {
		    if (model.add(element)) {
		      fireContentsChanged(this, 0, getSize());
		    }
		  }

		  public void addAll(Object elements[]) {
		    Collection c = Arrays.asList(elements);
		    model.addAll(c);
		    fireContentsChanged(this, 0, getSize());
		  }

		  public void clear() {
		    model.clear();
		    fireContentsChanged(this, 0, getSize());
		  }

		  public boolean contains(Object element) {
		    return model.contains(element);
		  }

		  public Object firstElement() {
		    return model.first();
		  }

		  public Iterator iterator() {
		    return model.iterator();
		  }

		  public Object lastElement() {
		    return model.last();
		  }

		  public boolean removeElement(Object element) {
		    boolean removed = model.remove(element);
		    if (removed) {
		      fireContentsChanged(this, 0, getSize());
		    }
		    return removed;
		  }
	}

	class ListKeyListener implements KeyListener {
                       
		private JList source;
		private JList destination;
		private int moveKey;
                       
		public ListKeyListener(JList source, JList destination, int moveKey) {
			this.source = source;
			this.destination = destination;
			this.moveKey = moveKey;
		}
 
		@Override
		public void keyPressed(KeyEvent e) {
			// TODO Auto-generated method stub
			if(e.getKeyCode() == this.moveKey){
				MoveItem moveItem = new MoveItem(this.source, this.destination);
				moveItem.actionPerformed(null);
			}
		}
 
		@Override
		public void keyReleased(KeyEvent arg0) {
			// TODO Auto-generated method stub
		}
 
		@Override
		public void keyTyped(KeyEvent arg0) {
			// TODO Auto-generated method stub
		}
	}
           
	class MoveItem implements ActionListener {
		private JList source;
		private JList destination;
                       
		public MoveItem(JList source, JList destination) {
			this.destination = destination;
			this.source = source;
		}
 
		public void actionPerformed(ActionEvent arg0) {
			// TODO Auto-generated method stub
			int[] index = this.source.getSelectedIndices();
                                  
			Object[] values = this.source.getSelectedValues();
			for(Object value : values){
				((SortedListModel)this.destination.getModel()).add(value);
			}

			for(int counter = (index.length -1); counter >= 0; counter--){
//				((SortedListModel)this.source.getModel()).removeElement(index[counter]);
			}
		}
	}
	
  

	class ListItemTransferHandler extends TransferHandler {
		private int[] indices = null;
		private int addIndex  = -1; //Location where items were added
		private int addCount  = 0;  //Number of items added.
		private final DataFlavor localObjectFlavor;
		private Object[] transferedObjects = null;
		private JList source = null;
               
		public ListItemTransferHandler() {
			localObjectFlavor = new ActivationDataFlavor(Object[].class, DataFlavor.javaJVMLocalObjectMimeType, "Array of items");
		}
               
		@Override
		protected Transferable createTransferable(JComponent c) {
			source = (JList) c;
			indices = source.getSelectedIndices();
			transferedObjects = source.getSelectedValues();
			return new DataHandler(transferedObjects, localObjectFlavor.getMimeType());
		}
               
		@Override
		public boolean canImport(TransferHandler.TransferSupport info) {
			return info.isDrop() && info.isDataFlavorSupported(localObjectFlavor);
		}
               
		@Override
		public int getSourceActions(JComponent c) {
			return TransferHandler.MOVE; //TransferHandler.COPY_OR_MOVE;
		}
               
		@Override
		public boolean importData(TransferHandler.TransferSupport info) {
			if (!canImport(info)) {
				return false;
			}
			JList target = (JList)info.getComponent();
			JList.DropLocation dl = (JList.DropLocation)info.getDropLocation();
			SortedListModel listModel = (SortedListModel)target.getModel();
			int index = dl.getIndex();
			//boolean insert = dl.isInsert();
			int max = listModel.getSize();
			if(index<0 || index>max) {
				index = max;
			}
			addIndex = index;
 
			try{
				Object[] values = (Object[])info.getTransferable().getTransferData(localObjectFlavor);
				for(int i=0;i<values.length;i++) {
					int idx = index++;
					//listModel.addElement(idx, values[i]);
					target.addSelectionInterval(idx, idx);
				}
				addCount = (target==source)? values.length : 0;
				return true;
			}catch(UnsupportedFlavorException ufe) {
				ufe.printStackTrace();
			}catch(java.io.IOException ioe) {
				ioe.printStackTrace();
			}
			return false;
		}
               
		@Override
		protected void exportDone(JComponent c, Transferable data, int action) {
			cleanup(c, action == TransferHandler.MOVE);
		}
               
		private void cleanup(JComponent c, boolean remove) {
			if(remove && indices != null) {
				JList source = (JList)c;
				SortedListModel model  = (SortedListModel)source.getModel();
				//If we are moving items around in the same list, we
				//need to adjust the indices accordingly, since those
				//after the insertion point have moved.
				if(addCount > 0) {
					for(int i=0;i<indices.length;i++) {
						if(indices[i]>=addIndex) {
							indices[i] += addCount;
						}
					}
				}
				for(int i=indices.length-1;i>=0;i--) {
					//model.remove(indices[i]);
				}
			}
			indices  = null;
			addCount = 0;
			addIndex = -1;
		}
	}
 
Zuletzt bearbeitet:

r.w.

Bekanntes Mitglied
Hallo Sundal,

die Elemente werden nicht automatisch aus der Source-Liste entfernt. ;-)

Den Rest des Quellcodes hab ich mir nicht angesehen, aber so
sollte es beim Klick auf die Buttons funktionieren:

[JAVA=208]

//...

class MoveItem implements ActionListener {
private JList source;
private JList destination;

public MoveItem(JList source, JList destination) {
this.destination = destination;
this.source = source;
}

public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
int[] index = this.source.getSelectedIndices();

Object[] values = this.source.getSelectedValues();
for(Object value : values){
((SortedListModel)this.destination.getModel()).add(value);

// Elemente aus Quell-Liste loeschen...
((SortedListModel)this.source.getModel()).removeElement(value);
}

// ... und im Anschluss die Auswahl zuruecksetzen:
this.source.getSelectionModel().clearSelection();

// for(int counter = (index.length -1); counter >= 0; counter--){
//// ((SortedListModel)this.source.getModel()).removeElement(index[counter]);
// }
}
}

//...

[/code]

removeElement() erwartet übrigens ein Object (also den Wert aus der Liste) und nicht
einen Index. Daher kann Deine auskommentierte Zeile 236 (in meinem Code) nicht funktionieren.

Auch solltest Du nach dem Löschen der Elemente die Auswahl in der Quell-Liste aufheben,
da sonst eventuell noch Indizes selektiert bleiben, die bereits entfernt wurden. Das würde
beim erneuten Klick auf den Button eine ArrayIndexOutOfBoundsException werfen.

Du kannst das ausprobieren, indem Du meine Zeile 233 auskommentierst, das Programm
startest, in der linken Liste das letzte Element auswählst und dann 2x auf ADD klickst.

VG ROlf
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JList, einzelne Strings hinzufügen AWT, Swing, JavaFX & SWT 9
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

Ähnliche Java Themen

Neue Themen


Oben