# Drag and Drop



## Kaladial (20. Aug 2007)

So erstmal Code (ich weis is wieder recht viel und alles mögliche drin aber naja  ):


```
public class DlgUserGrpVerwaltung extends JDialog {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JPanel jPanelUser = null;
	private JPanel jPanelGruppe = null;
	private JPanel jPanelSouth = null;
	private JButton jButtonOk = null;
	private JLabel jLabel = null;
	private JButton jButtonAbbruch = null;
	private JLabel jLabelUser = null;
	private JLabel jLabelGruppe = null;

	/**
	 * @param owner
	 */
	public DlgUserGrpVerwaltung(Frame owner) {
		super(owner);
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setBounds(new Rectangle(0, 0, 500, 400));
		this.setContentPane(getJContentPane());
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jLabelUser = new JLabel();
			jLabelUser.setBounds(new Rectangle(15, 15, 225, 25));
			jLabelUser.setText("User:");
			jLabelUser.setHorizontalAlignment(JLabel.CENTER);
			jLabelGruppe = new JLabel();
			jLabelGruppe.setBounds(new Rectangle(250, 15, 225, 25));
			jLabelGruppe.setText("Gruppen:");
			jLabelGruppe.setHorizontalAlignment(JLabel.CENTER);
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(getJPanelUser(), null);
			jContentPane.add(getJPanelGruppe(), null);
			jContentPane.add(getJPanelSouth(), null);
			jContentPane.add(jLabelUser, null);
			jContentPane.add(jLabelGruppe, null);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jPanelUser	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanelUser() {
		if (jPanelUser == null) {
			jPanelUser = new JPanel();
			jPanelUser.setLayout(new GridLayout(1,1));
			jPanelUser.setBounds(new Rectangle(15, 55, 225, 260));
			jPanelUser.add(createListUser("User")); 

		}
		return jPanelUser;
	}

	/**
	 * This method initializes jPanelGruppe	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanelGruppe() {
		if (jPanelGruppe == null) {
			jPanelGruppe = new JPanel();
			jPanelGruppe.setLayout(new GridLayout(1,1));
			jPanelGruppe.setBounds(new Rectangle(250, 55, 225, 260));
			jPanelGruppe.add(createListGruppe("Gruppe")); 
		}
		return jPanelGruppe;
	}

	/**
	 * This method initializes jPanelSouth	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanelSouth() {
		if (jPanelSouth == null) {
			jLabel = new JLabel();
			jLabel.setText("");
			jLabel.setPreferredSize(new Dimension(40, 0));
			jPanelSouth = new JPanel();
			jPanelSouth.setLayout(new FlowLayout());
			jPanelSouth.setBounds(new Rectangle(0, 333, 493, 40));
			jPanelSouth.add(getJButtonOk(), null);
			jPanelSouth.add(jLabel, null);
			jPanelSouth.add(getJButtonAbbruch(), null);
		}
		return jPanelSouth;
	}

	/**
	 * This method initializes jButtonOk	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButtonOk() {
		if (jButtonOk == null) {
			jButtonOk = new JButton();
			jButtonOk.setText("OK");
			jButtonOk.setPreferredSize(new Dimension(100, 30));
			jButtonOk.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed()
				}
			});
		}
		return jButtonOk;
	}

	/**
	 * This method initializes jButtonAbbruch	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButtonAbbruch() {
		if (jButtonAbbruch == null) {
			jButtonAbbruch = new JButton();
			jButtonAbbruch.setPreferredSize(new Dimension(100, 30));
			jButtonAbbruch.setText("Abbruch");
			jButtonAbbruch.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					dispose();
				}
			});
		}
		return jButtonAbbruch;
	}

    private JPanel createListUser(String listId) { 
        DefaultListModel model = new DefaultListModel();
        String erg[]=DB.getUser();
        for(int i=0; i<erg.length; i++){
        	if(erg[i]==null){
        		break;
        	}
        	String erg_split[]=GlobaleFunction.split(erg[i], ": ");
        	model.addElement(erg_split[1]); 
        }
        JList list = new JList(model);
        list.setName(listId);
        list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); 
        JScrollPane scrollPane = new JScrollPane(list); 
        scrollPane.setPreferredSize(new Dimension(225, 250)); 
        list.setDragEnabled(true); 
        list.setTransferHandler(new ListTransferHandler()); 
        JPanel panel = new JPanel(); 
        panel.add(scrollPane); 
        return panel; 
    } 

    private JPanel createListGruppe(String listId) { 
        DefaultListModel model = new DefaultListModel(); 

        String erg[]=DB.getGrps();
        for(int i=0; i<erg.length; i++){
        	if(erg[i]==null){
        		break;
        	}
        	String erg_split[]=GlobaleFunction.split(erg[i], ": ");
        	if(erg_split[1].compareToIgnoreCase("keine")!=0){
        		model.addElement(erg_split[1]); 
        	}
        }

        JList list = new JList(model);
        list.setName(listId);
        list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); 
        JScrollPane scrollPane = new JScrollPane(list); 
        scrollPane.setPreferredSize(new Dimension(225, 250)); 
        list.setDragEnabled(true); 
        list.setTransferHandler(new ListTransferHandler()); 
        JPanel panel = new JPanel(); 
        panel.add(scrollPane); 
        return panel; 
    } 

    abstract class StringTransferHandler extends TransferHandler { 
        protected abstract String exportString(JComponent c); 
        protected abstract void importString(JComponent c, String str); 
        protected abstract void cleanup(JComponent c, boolean remove); 
        protected Transferable createTransferable(JComponent c) { 
            return new StringSelection(exportString(c)); 
        } 
        public int getSourceActions(JComponent c) { 
            return COPY_OR_MOVE; 
        } 
        public boolean importData(JComponent c, Transferable t) { 
        	JList source = (JList)c;
        	if(source.getName().compareToIgnoreCase("Gruppe")==0){
        	
	            if (canImport(c, t.getTransferDataFlavors())) { 
	                try { 
	                    String str = (String)t.getTransferData(DataFlavor.stringFlavor); 
	                    importString(c, str); 
	                    return true; 
	                } catch (UnsupportedFlavorException ufe) { 
	                } catch (IOException ioe) { 
	                } 
	            }
        	}else{
        		return true; 
        	}
            return false; 
        } 
        protected void exportDone(JComponent c, Transferable data, int action) {
        	JList source = (JList)c;
        	if(source.getName().compareToIgnoreCase("Gruppe")==0){
        		cleanup(c, action == MOVE);
        	}
        } 
        public boolean canImport(JComponent c, DataFlavor[] flavors) { 
            for (int ndx = 0; ndx < flavors.length; ndx++) { 
                if (DataFlavor.stringFlavor.equals(flavors[ndx])) { 
                    return true; 
                } 
            } 
            return false; 
        } 
    } 
    class ListTransferHandler extends StringTransferHandler { 
        public JList target; 
        public int[] rows = null; 
        public int addIndex = -1; //Position an der die Zeilen eingefügt werden 
        public int addCount = 0;  //Anzahl der eingefügten Zeilen. 
        protected String exportString(JComponent c) { 
            JList list = (JList)c; 
            rows = list.getSelectedIndices(); 
            StringBuffer buff = new StringBuffer(); 
            for (int ndx = 0; ndx < rows.length; ndx++) { 
                Object val = ((DefaultListModel)list.getModel()).getElementAt(rows[ndx]); 
                buff.append(val == null ? "" : val.toString()); 
                if (ndx != rows.length - 1) { 
                    buff.append("\n"); 
                } 
            } 
            return buff.toString(); 
        } 
        protected void importString(JComponent c, String str) { 
            target = (JList)c; 
            DefaultListModel model = (DefaultListModel)target.getModel(); 
            int index = target.getSelectedIndex(); 
            //Der Benutzer wird daran gehindert die Daten auf sich selbst fallen zu lassen. 
            //Zum Beispiel, wenn der Benutzer die Zeilen #4,#5,#6 und #7 verschiebt und 
            //versucht sie unterhalb der Zeile #5 einzufügen, wäre es 
            //problematisch die ursprünglichen Zeilen zu entfernen. 
            //Daher wird dies nicht erlaubt. 
            if (rows != null && index >= rows[0] - 1 && 
                    index <= rows[rows.length - 1]) { 
                rows = null; 
                return; 
            } 
            int max = model.getSize(); 
            if (index < 0) { 
                index = max; 
            } else { 
                index++; 
                if (index > max) { 
                    index = max; 
                } 
            } 
            addIndex = index; 
            String[] values = str.split("\n"); 
            addCount = values.length; 
            for (int ndx = 0; ndx < values.length ; ndx++) { 
                model.insertElementAt( values[ndx], index++); 
            } 
            //Wenn wir Zeilen innerhalb derselben Liste verschieben, müssen 
            //wir die Zeilen entsprechend anpassen, da diejenigen 
            //hinter dem Einfügungspunkt verschoben werden. 
            if (rows!= null && addCount > 0) { 
                for (int ndx = 0; ndx < rows.length; ndx++) { 
                    if (rows[ndx] > addIndex) { 
                        rows[ndx] += addCount; 
                    } 
                } 
            } 
        } 
        protected void cleanup(JComponent c, boolean remove) { 
            JList source = (JList)c; 
            if (remove && rows != null) { 
                DefaultListModel model = 
                        (DefaultListModel)source.getModel(); 
                for (int ndx = rows.length - 1; ndx >= 0; ndx--) { 
                    model.removeElementAt(rows[ndx]); 
                } 
            } 
            rows = null; 
            addCount = 0; 
            addIndex = -1; 
        } 
    } 	
}
```

ich habe den code von hier(http://www.java-forum.org/de/viewtopic.php?p=208138#208138) genommen und ein klein wenig angepasst...

- also zum einen hol ich mir meine daten aus der datenbank 
- zum anderen lösche ich aus dem user-panel keine daten und trag auch keine ein...

also jetzt zu meinem problem: 

ich möchte das die daten die ich am anfang in die liste gruppe eintrage nie gelöscht werden verschiebbar sind und am besten gar nicht markierbar und noch schöner wäre nicht markierbar und ne andere frabe haben... 

die user sollen aber normal rein und rausgezogen werden können (aber viellicht nicht doppelt in einer gruppe (also z.b. grp a: da hab ich user b rein gezogen nun soll es so sein das ich in grp a keinen user b mehr rein ziehn darf)

Falsch:

Grp A
User B
User B

Richtig:
Grp A
User B
Grp B
Userb

mfg Kala


----------



## Marco13 (20. Aug 2007)

Es ist recht viel, aber trotzdem noch zu wenig, und es ist alles mögliche drin, aber etwas fehlt noch: Eine main, und ein paar Dummy-Daten, dann wäre es ein Kleines, selbstständiges, kompilierbares Beispiel....


----------



## Kaladial (20. Aug 2007)

hi

jo is richtig
is halt wieder eins von meinen dialog fenstern... 

ok ich post nochmal den code diesesmal mit aufrufender datei damit ihr es auch ausprobieren könnt:

Aufrufende Datei (DlgTestUserVerwaltung.java):

```
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;

public class DlgTestUserVerwaltung extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JButton jButtonStart = null;

	/**
	 * This method initializes jButtonStart	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButtonStart() {
		if (jButtonStart == null) {
			jButtonStart = new JButton();
			jButtonStart.setText("Start");
			jButtonStart.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					user_grp_verwaltung("User-Verwaltung");
				}
			});
		}
		return jButtonStart;
	}
	private void user_grp_verwaltung(String aktion){
		DlgUserGrpVerwaltung dlg = new DlgUserGrpVerwaltung(this); 
    	dlg.setTitle(aktion);
    	dlg.setModal(true);
    	dlg.setVisible(true);
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				DlgTestUserVerwaltung thisClass = new DlgTestUserVerwaltung();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}

	/**
	 * This is the default constructor
	 */
	public DlgTestUserVerwaltung() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJButtonStart(), BorderLayout.CENTER);
		}
		return jContentPane;
	}

}
```

Und halt die Datei mit Standart-Daten (DlgUserGrpVerwaltung.java):

```
import javax.swing.JPanel;
import java.awt.Frame;
import javax.swing.JDialog;

import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.FlowLayout;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.TransferHandler;

import java.awt.Dimension;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.awt.Color;

public class DlgUserGrpVerwaltung extends JDialog {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JPanel jPanelUser = null;
	private JPanel jPanelGruppe = null;
	private JPanel jPanelSouth = null;
	private JButton jButtonOk = null;
	private JLabel jLabel = null;
	private JButton jButtonAbbruch = null;
	private JLabel jLabelUser = null;
	private JLabel jLabelGruppe = null;

	/**
	 * @param owner
	 */
	public DlgUserGrpVerwaltung(Frame owner) {
		super(owner);
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setBounds(new Rectangle(0, 0, 500, 400));
		this.setContentPane(getJContentPane());
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jLabelUser = new JLabel();
			jLabelUser.setBounds(new Rectangle(15, 15, 225, 25));
			jLabelUser.setText("User:");
			jLabelUser.setHorizontalAlignment(JLabel.CENTER);
			jLabelGruppe = new JLabel();
			jLabelGruppe.setBounds(new Rectangle(250, 15, 225, 25));
			jLabelGruppe.setText("Gruppen:");
			jLabelGruppe.setHorizontalAlignment(JLabel.CENTER);
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(getJPanelUser(), null);
			jContentPane.add(getJPanelGruppe(), null);
			jContentPane.add(getJPanelSouth(), null);
			jContentPane.add(jLabelUser, null);
			jContentPane.add(jLabelGruppe, null);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jPanelUser	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanelUser() {
		if (jPanelUser == null) {
			jPanelUser = new JPanel();
			jPanelUser.setLayout(new GridLayout(1,1));
			jPanelUser.setBounds(new Rectangle(15, 55, 225, 260));
			jPanelUser.add(createListUser("User")); 

		}
		return jPanelUser;
	}

	/**
	 * This method initializes jPanelGruppe	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanelGruppe() {
		if (jPanelGruppe == null) {
			jPanelGruppe = new JPanel();
			jPanelGruppe.setLayout(new GridLayout(1,1));
			jPanelGruppe.setBounds(new Rectangle(250, 55, 225, 260));
			jPanelGruppe.add(createListGruppe("Gruppe")); 
		}
		return jPanelGruppe;
	}

	/**
	 * This method initializes jPanelSouth	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanelSouth() {
		if (jPanelSouth == null) {
			jLabel = new JLabel();
			jLabel.setText("");
			jLabel.setPreferredSize(new Dimension(40, 0));
			jPanelSouth = new JPanel();
			jPanelSouth.setLayout(new FlowLayout());
			jPanelSouth.setBounds(new Rectangle(0, 333, 493, 40));
			jPanelSouth.add(getJButtonOk(), null);
			jPanelSouth.add(jLabel, null);
			jPanelSouth.add(getJButtonAbbruch(), null);
		}
		return jPanelSouth;
	}

	/**
	 * This method initializes jButtonOk	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButtonOk() {
		if (jButtonOk == null) {
			jButtonOk = new JButton();
			jButtonOk.setText("OK");
			jButtonOk.setPreferredSize(new Dimension(100, 30));
			jButtonOk.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed()
				}
			});
		}
		return jButtonOk;
	}

	/**
	 * This method initializes jButtonAbbruch	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButtonAbbruch() {
		if (jButtonAbbruch == null) {
			jButtonAbbruch = new JButton();
			jButtonAbbruch.setPreferredSize(new Dimension(100, 30));
			jButtonAbbruch.setText("Abbruch");
			jButtonAbbruch.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					dispose();
				}
			});
		}
		return jButtonAbbruch;
	}

    private JPanel createListUser(String listId) { 
        DefaultListModel model = new DefaultListModel();
        String erg[]={"test","test2","test3"};
        for(int i=0; i<erg.length; i++){
        	if(erg[i]==null){
        		break;
        	}
        	model.addElement(erg[i]); 
        }
        JList list = new JList(model);
        list.setName(listId);
        list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); 
        list.setDragEnabled(true); 
        list.setTransferHandler(new ListTransferHandler());

        JScrollPane scrollPane = new JScrollPane(list); 
        scrollPane.setPreferredSize(new Dimension(225, 250)); 
        
        JPanel panel = new JPanel(); 
        panel.add(scrollPane); 
        return panel; 
    } 
    
    private JPanel createListGruppe(String listId) { 
        DefaultListModel model = new DefaultListModel(); 
        String erg[]={"3test","2test","1test"};
        for(int i=0; i<erg.length; i++){
        	if(erg[i]==null){
        		break;
        	}
        	model.addElement(erg[i]); 
        }

        JList list = new JList(model);
        list.setName(listId);
        list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); 
        list.setDragEnabled(true); 
        list.setTransferHandler(new ListTransferHandler()); 
        
        JScrollPane scrollPane = new JScrollPane(list); 
        scrollPane.setPreferredSize(new Dimension(225, 250)); 
        
        JPanel panel = new JPanel(); 
        panel.add(scrollPane); 
        return panel; 
    } 

    abstract class StringTransferHandler extends TransferHandler { 
        protected abstract String exportString(JComponent c); 
        protected abstract void importString(JComponent c, String str); 
        protected abstract void cleanup(JComponent c, boolean remove); 
        protected Transferable createTransferable(JComponent c) { 
            return new StringSelection(exportString(c)); 
        } 
        public int getSourceActions(JComponent c) { 
            return COPY_OR_MOVE; 
        } 
        public boolean importData(JComponent c, Transferable t) { 
        	JList source = (JList)c;
        	if(source.getName().compareToIgnoreCase("Gruppe")==0){
        	
	            if (canImport(c, t.getTransferDataFlavors())) { 
	                try { 
	                    String str = (String)t.getTransferData(DataFlavor.stringFlavor); 
	                    importString(c, str); 
	                    return true; 
	                } catch (UnsupportedFlavorException ufe) { 
	                } catch (IOException ioe) { 
	                } 
	            }
        	}else{
        		return true; 
        	}
            return false; 
        } 
        protected void exportDone(JComponent c, Transferable data, int action) {
        	JList source = (JList)c;
        	if(source.getName().compareToIgnoreCase("Gruppe")==0){
        		cleanup(c, action == MOVE);
        	}
        } 
        public boolean canImport(JComponent c, DataFlavor[] flavors) { 
            for (int ndx = 0; ndx < flavors.length; ndx++) { 
                if (DataFlavor.stringFlavor.equals(flavors[ndx])) { 
                    return true; 
                } 
            } 
            return false; 
        } 
    } 
    class ListTransferHandler extends StringTransferHandler { 
        public JList target; 
        public int[] rows = null; 
        public int addIndex = -1; //Position an der die Zeilen eingefügt werden 
        public int addCount = 0;  //Anzahl der eingefügten Zeilen. 
        protected String exportString(JComponent c) { 
            JList list = (JList)c; 
            rows = list.getSelectedIndices(); 
            StringBuffer buff = new StringBuffer(); 
            for (int ndx = 0; ndx < rows.length; ndx++) { 
                Object val = ((DefaultListModel)list.getModel()).getElementAt(rows[ndx]); 
                buff.append(val == null ? "" : val.toString()); 
                if (ndx != rows.length - 1) { 
                    buff.append("\n"); 
                } 
            } 
            return buff.toString(); 
        } 
        protected void importString(JComponent c, String str) { 
            target = (JList)c; 
            DefaultListModel model = (DefaultListModel)target.getModel(); 
            int index = target.getSelectedIndex(); 
            //Der Benutzer wird daran gehindert die Daten auf sich selbst fallen zu lassen. 
            //Zum Beispiel, wenn der Benutzer die Zeilen #4,#5,#6 und #7 verschiebt und 
            //versucht sie unterhalb der Zeile #5 einzufügen, wäre es 
            //problematisch die ursprünglichen Zeilen zu entfernen. 
            //Daher wird dies nicht erlaubt. 
            if (rows != null && index >= rows[0] - 1 && 
                    index <= rows[rows.length - 1]) { 
                rows = null; 
                return; 
            } 
            int max = model.getSize(); 
            if (index < 0) { 
                index = max; 
            } else { 
                index++; 
                if (index > max) { 
                    index = max; 
                } 
            } 
            addIndex = index; 
            String[] values = str.split("\n"); 
            addCount = values.length; 
            for (int ndx = 0; ndx < values.length ; ndx++) { 
                model.insertElementAt( values[ndx], index++); 
            } 
            //Wenn wir Zeilen innerhalb derselben Liste verschieben, müssen 
            //wir die Zeilen entsprechend anpassen, da diejenigen 
            //hinter dem Einfügungspunkt verschoben werden. 
            if (rows!= null && addCount > 0) { 
                for (int ndx = 0; ndx < rows.length; ndx++) { 
                    if (rows[ndx] > addIndex) { 
                        rows[ndx] += addCount; 
                    } 
                } 
            } 
        } 
        protected void cleanup(JComponent c, boolean remove) { 
            JList source = (JList)c; 
            if (remove && rows != null) { 
                DefaultListModel model = 
                        (DefaultListModel)source.getModel(); 
                for (int ndx = rows.length - 1; ndx >= 0; ndx--) { 
                    model.removeElementAt(rows[ndx]); 
                } 
            } 
            rows = null; 
            addCount = 0; 
            addIndex = -1; 
        } 
    } 	
}
```


----------



## Kaladial (20. Aug 2007)

habs inzwischen gelöst... hab nen boxlayout benutzt und die gruppen als titel anzeigen lassen geht wunderbar


----------



## André Uhres (20. Aug 2007)

Kaladial hat gesagt.:
			
		

> habs inzwischen gelöst... hab nen boxlayout benutzt und die gruppen als titel anzeigen lassen geht wunderbar


Könntest ja die Lösung zum Nutzen aller auch posten :wink:

Hier ist meine Lösung:

Um die Gruppen der Gruppenliste von den Usern unterscheiden zu können,
ist es imho am besten, die Gruppen in eine eigene Wrapperklasse unterzubringen,
die im folgenden Code "GroupItem" genannt wurde.

Die Einführung dieser Klasse bedingt aber auch ein Umbauen des Transferhandlers und
die Einführung eines DropTarget (Klasse "GroupDropTarget") 
und eines Transferable (Klasse "GenericTransferable"). 

Zusätzlich benötigen wir einen ListCellRenderer für das Einfärben der Gruppen
(Klasse "GroupCellRenderer").
http://www.java-forum.org/de/userfiles/user3690/DlgUserGrpVerwaltung.java

EDIT: da ist noch ein Problem beim Verschieben innerhalb einer Gruppe. Ich schau danach :wink:
EDIT: OK, ist gelöst (Methode "inSameGroup").
EDIT: da ist noch ein Problem beim Verschieben vopn Gruppe zu Gruppe,
wenn in der Zielgruppe schon die gleichen User sind.
EDIT: OK, ist gelöst ("addCount" hatte nicht die tatsächlich eingefügten Zeilen gezählt)


----------



## Kaladial (20. Aug 2007)

also hier mal meine lösung:

an der aufrufenden klasse hat sich nix verändert...


```
package AVS3;

import javax.swing.JPanel;
import java.awt.Frame;
import javax.swing.JDialog;

import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.FlowLayout;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.TransferHandler;
import javax.swing.border.TitledBorder;

import java.awt.Dimension;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.awt.Color;

public class DlgUserGrpVerwaltung extends JDialog {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JPanel jPanelUser = null;
	private JPanel jPanelGruppe = null;
	private JPanel jPanelSouth = null;
	private JButton jButtonOk = null;
	private JLabel jLabel = null;
	private JButton jButtonAbbruch = null;
	private JLabel jLabelUser = null;
	private JLabel jLabelGruppe = null;

	/**
	 * @param owner
	 */
	public DlgUserGrpVerwaltung(Frame owner) {
		super(owner);
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setBounds(new Rectangle(0, 0, 500, 400));
		this.setContentPane(getJContentPane());
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jLabelUser = new JLabel();
			jLabelUser.setBounds(new Rectangle(15, 15, 225, 25));
			jLabelUser.setText("User:");
			jLabelUser.setHorizontalAlignment(JLabel.CENTER);
			jLabelGruppe = new JLabel();
			jLabelGruppe.setBounds(new Rectangle(250, 15, 225, 25));
			jLabelGruppe.setText("Gruppen:");
			jLabelGruppe.setHorizontalAlignment(JLabel.CENTER);
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(getJPanelUser(), null);
			jContentPane.add(getJPanelGruppe(), null);
			jContentPane.add(getJPanelSouth(), null);
			jContentPane.add(jLabelUser, null);
			jContentPane.add(jLabelGruppe, null);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jPanelUser	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanelUser() {
		if (jPanelUser == null) {
			jPanelUser = new JPanel();
			jPanelUser.setLayout(new GridLayout(1,1));
			jPanelUser.setBounds(new Rectangle(15, 55, 225, 250));
            JScrollPane scrollPane = new JScrollPane(createListUser("User")); 
            scrollPane.setPreferredSize(new Dimension(225, 250)); 
            jPanelUser.add(scrollPane); 


		}
		return jPanelUser;
	}

	/**
	 * This method initializes jPanelGruppe	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanelGruppe() {
		if (jPanelGruppe == null) {
			jPanelGruppe = new JPanel();
			jPanelGruppe.setLayout(new GridLayout(1,1));
			jPanelGruppe.setBounds(new Rectangle(250, 55, 225, 250));
            JScrollPane scrollPane = new JScrollPane(createListGruppe("Gruppe")); 
            scrollPane.setPreferredSize(new Dimension(225, 250)); 
            jPanelGruppe.add(scrollPane); 
		}
		return jPanelGruppe;
	}

	/**
	 * This method initializes jPanelSouth	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanelSouth() {
		if (jPanelSouth == null) {
			jLabel = new JLabel();
			jLabel.setText("");
			jLabel.setPreferredSize(new Dimension(40, 0));
			jPanelSouth = new JPanel();
			jPanelSouth.setLayout(new FlowLayout());
			jPanelSouth.setBounds(new Rectangle(0, 333, 493, 40));
			jPanelSouth.add(getJButtonOk(), null);
			jPanelSouth.add(jLabel, null);
			jPanelSouth.add(getJButtonAbbruch(), null);
		}
		return jPanelSouth;
	}

	/**
	 * This method initializes jButtonOk	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButtonOk() {
		if (jButtonOk == null) {
			jButtonOk = new JButton();
			jButtonOk.setText("OK");
			jButtonOk.setPreferredSize(new Dimension(100, 30));
			jButtonOk.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed()
				}
			});
		}
		return jButtonOk;
	}

	/**
	 * This method initializes jButtonAbbruch	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButtonAbbruch() {
		if (jButtonAbbruch == null) {
			jButtonAbbruch = new JButton();
			jButtonAbbruch.setPreferredSize(new Dimension(100, 30));
			jButtonAbbruch.setText("Abbruch");
			jButtonAbbruch.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					dispose();
				}
			});
		}
		return jButtonAbbruch;
	}

    private JPanel createListUser(String listId) { 
        JPanel panel = new JPanel(); 
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        DefaultListModel model = new DefaultListModel();
        String erg[]=DB.getUser();
        for(int i=0; i<erg.length; i++){
        	if(erg[i]==null){
        		break;
        	}
        	String erg_split[]=GlobaleFunction.split(erg[i], ": ");
        	model.addElement(erg_split[1]); 
        }

        JList list = new JList(model);
        list.setName(listId);
        list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); 
        list.setDragEnabled(true); 
        list.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.white, 5), "", TitledBorder.CENTER, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
        list.setTransferHandler(new ListTransferHandler());

        JScrollPane scrollPane = new JScrollPane(list); 
        scrollPane.setPreferredSize(new Dimension(200, 225)); 
        
        panel.add(scrollPane); 
        return panel; 
    } 
    
    private JPanel createListGruppe(String listId) { 
    	JPanel panel = new JPanel();
    	panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        String erg[]=DB.getGrps();
        for(int i=0; i<erg.length; i++){
        	if(erg[i]==null){
        		break;
        	}
        	String erg_split[]=GlobaleFunction.split(erg[i], ": ");
        	if(erg_split[1].compareToIgnoreCase("keine")!=0){

	        	DefaultListModel model = new DefaultListModel(); 
	            JList list = new JList(model);
	            list.setName(listId);
	            list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); 
	            list.setDragEnabled(true); 
	            list.setTransferHandler(new ListTransferHandler()); 
	            list.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.white, 5), erg_split[1], TitledBorder.CENTER, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
	            
	            JScrollPane scrollPane = new JScrollPane(list); 
	            scrollPane.setPreferredSize(new Dimension(200, 82)); 
	            
	            panel.add(scrollPane);
        	}
        }
        return panel; 
    } 

    abstract class StringTransferHandler extends TransferHandler { 
        protected abstract String exportString(JComponent c); 
        protected abstract void importString(JComponent c, String str); 
        protected abstract void cleanup(JComponent c, boolean remove); 
        protected Transferable createTransferable(JComponent c) { 
            return new StringSelection(exportString(c)); 
        } 
        public int getSourceActions(JComponent c) { 
            return COPY_OR_MOVE; 
        } 
        public boolean importData(JComponent c, Transferable t) { 
        	JList source = (JList)c;
        	int schon_vorhanden=0;
        	if(source.getName().compareToIgnoreCase("Gruppe")==0){
        		
                DefaultListModel model = (DefaultListModel)source.getModel();
                int max = model.getSize();
                 
                for(int i=0; i<max; i++){
                	String list_element=((DefaultListModel)source.getModel()).getElementAt(i).toString();
                	try {
	                	String str = (String)t.getTransferData(DataFlavor.stringFlavor);
	                	if(list_element.compareToIgnoreCase(str)==0){
	                		schon_vorhanden=1;
	                		break;
	                	}
                	} catch (UnsupportedFlavorException ufe) { 
	                } catch (IOException ioe) {} 
                }
                if(schon_vorhanden==0){
		            if (canImport(c, t.getTransferDataFlavors())) { 
		                try { 
		                    String str = (String)t.getTransferData(DataFlavor.stringFlavor); 
		                    importString(c, str); 
		                    return true; 
		                } catch (UnsupportedFlavorException ufe) { 
		                } catch (IOException ioe) { 
		                } 
		            }
                }
        	}else{
        		return true; 
        	}
            return false; 
        } 
        protected void exportDone(JComponent c, Transferable data, int action) {
        	JList source = (JList)c;
        	if(source.getName().compareToIgnoreCase("Gruppe")==0){
        		cleanup(c, action == MOVE);
        	}
        } 
        public boolean canImport(JComponent c, DataFlavor[] flavors) { 
            for (int ndx = 0; ndx < flavors.length; ndx++) { 
                if (DataFlavor.stringFlavor.equals(flavors[ndx])) { 
                    return true; 
                } 
            } 
            return false; 
        } 
    } 
    class ListTransferHandler extends StringTransferHandler { 
        public JList target; 
        public int[] rows = null; 
        public int addIndex = -1; //Position an der die Zeilen eingefügt werden 
        public int addCount = 0;  //Anzahl der eingefügten Zeilen. 
        protected String exportString(JComponent c) { 
            JList list = (JList)c; 
            rows = list.getSelectedIndices(); 
            StringBuffer buff = new StringBuffer(); 
            for (int ndx = 0; ndx < rows.length; ndx++) { 
                Object val = ((DefaultListModel)list.getModel()).getElementAt(rows[ndx]); 
                buff.append(val == null ? "" : val.toString()); 
                if (ndx != rows.length - 1) { 
                    buff.append("\n"); 
                } 
            } 
            return buff.toString(); 
        } 
        protected void importString(JComponent c, String str) { 
            target = (JList)c; 
            DefaultListModel model = (DefaultListModel)target.getModel(); 
            int index = target.getSelectedIndex(); 
            //Der Benutzer wird daran gehindert die Daten auf sich selbst fallen zu lassen. 
            //Zum Beispiel, wenn der Benutzer die Zeilen #4,#5,#6 und #7 verschiebt und 
            //versucht sie unterhalb der Zeile #5 einzufügen, wäre es 
            //problematisch die ursprünglichen Zeilen zu entfernen. 
            //Daher wird dies nicht erlaubt. 
            if (rows != null && index >= rows[0] - 1 && 
                    index <= rows[rows.length - 1]) { 
                rows = null; 
                return; 
            } 
            int max = model.getSize(); 
            if (index < 0) { 
                index = max; 
            } else { 
                index++; 
                if (index > max) { 
                    index = max; 
                } 
            } 
            addIndex = index; 
            String[] values = str.split("\n"); 
            addCount = values.length; 
            for (int ndx = 0; ndx < values.length ; ndx++) { 
                model.insertElementAt( values[ndx], index++); 
            } 
            //Wenn wir Zeilen innerhalb derselben Liste verschieben, müssen 
            //wir die Zeilen entsprechend anpassen, da diejenigen 
            //hinter dem Einfügungspunkt verschoben werden. 
            if (rows!= null && addCount > 0) { 
                for (int ndx = 0; ndx < rows.length; ndx++) { 
                    if (rows[ndx] > addIndex) { 
                        rows[ndx] += addCount; 
                    } 
                } 
            } 
        } 
        protected void cleanup(JComponent c, boolean remove) { 
            JList source = (JList)c; 
            if (remove && rows != null) { 
                DefaultListModel model = 
                        (DefaultListModel)source.getModel(); 
                for (int ndx = rows.length - 1; ndx >= 0; ndx--) { 
                    model.removeElementAt(rows[ndx]); 
                } 
            } 
            rows = null; 
            addCount = 0; 
            addIndex = -1; 
        } 
    } 	
}
```


----------



## André Uhres (20. Aug 2007)

Die Idee ist nicht schlecht. Hat aber noch einen Bug:
Verschieb mal die drei User von der linken Liste in die erste Gruppe.
Dann verschieb die drei User von der linken Liste in die zweite Gruppe.
Dann verschieb die drei User der zweiten Gruppe nach der ersten Gruppe: in der ersten Gruppe ist dann alles doppelt!

Ein Unterschied zu meiner Lösung ist, daß bei mir bei den Gruppen nur ein Scrollbalken erscheinen kann,
während es bei dir mehrere sein können.


----------



## Kaladial (21. Aug 2007)

thx für den hinweis... das muss ich dann gleich mal beheben ... 

das mit den vielen scrollbalken hab ich mir auch schon überlegt ... werd mal versuchen die einzelnen boxen an die anzahl der elemente anzupassen... ma gucken ob ich das hinbekomm


----------



## Kaladial (21. Aug 2007)

hmmm...

ich steh grad etwas auf dem schlauch... 
ich will die listen in den boxlayouts nach namen sortieren... 

aber ich weis ehrlich net wie ich anfangen soll... 

andre kannst mir da viellicht helfen?


----------



## André Uhres (21. Aug 2007)

Kaladial hat gesagt.:
			
		

> ..ich will die listen in den boxlayouts nach namen sortieren..


Mit Drag&Drop dürfte das ja kein Problem sein, nicht wahr?
Oder willst du's automatisch sortieren?



			
				Kaladial hat gesagt.:
			
		

> ..das mit den vielen scrollbalken hab ich mir auch schon überlegt ...
> werd mal versuchen die einzelnen boxen an die anzahl der elemente anzupassen..


Oder einfach meine Lösung nehmen


----------



## Kaladial (21. Aug 2007)

ich will das sobald ich nen neues element reinzieh das an der richtigen pos eingefügt wird bzw eingefürgt wird und dann sortiert wird,
also wenn ich da z.b.:

test1
test3
test5
 und dann
test2
soll das zwischen test1 und test3 eingefügt werden


----------



## André Uhres (21. Aug 2007)

Kaladial hat gesagt.:
			
		

> ich will das sobald ich nen neues element reinzieh das an der richtigen pos eingefügt wird bzw eingefürgt wird und dann sortiert wird,
> also wenn ich da z.b.:
> 
> test1
> ...


Wenn du's auf test1 fallen lässt, müsste es genau dahin kommen :wink:
Ansonsten kann man es ja danach noch mit der Maus verschieben.


----------



## Kaladial (21. Aug 2007)

jo is mir klar, aber wenn ich es net auf test1 fallen lass soll das trotzdem an die stelle kommen


----------



## Kaladial (21. Aug 2007)

ah und gleich noch was: ich will auf den titel nochmal zugreifen...
wie mach ich das?

also 
list.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.white, 5), erg_split[1], TitledBorder.CENTER, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51))); 

^^ das hab ich (kann ich auch drauf zugreifen) nur wie bekomm ich erg_split[1] ausgelesen?


----------



## André Uhres (21. Aug 2007)

Kaladial hat gesagt.:
			
		

> ah und gleich noch was: ich will auf den titel nochmal zugreifen..


In welchem Zusammenhang brauchst du den Titel?

EDIT: In meine Version hab ich jetzt sortAll und getTitle eingebaut :wink:
http://www.java-forum.org/de/userfiles/user3690/DlgUserGrpVerwaltung.java


----------



## Kaladial (21. Aug 2007)

ich hätte ihn für ne andere anzeige gebraucht hab das aber nun etwas anders gelöst... nich schön aber geht 

zu dem sortieren haste noch keine idee?


----------



## André Uhres (21. Aug 2007)

Kaladial hat gesagt.:
			
		

> ..zu dem sortieren haste noch keine idee?


http://www.java-forum.org/de/viewtopic.php?p=326795#326795


----------



## Kaladial (21. Aug 2007)

IWAV0052E Invocation Target Exception creating DlgUserGrpVerwaltung
java.lang.NoSuchMethodException: DlgUserGrpVerwaltung.<init>()
	at java.lang.Class.getConstructor0(Unknown Source)
	at java.lang.Class.getDeclaredConstructor(Unknown Source)
	at org.eclipse.ve.internal.java.vce.launcher.remotevm.JFCLauncher$1.run(JFCLauncher.java:56)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)




^^ bekomm ich wenn ich deine version ausführen will


----------



## André Uhres (21. Aug 2007)

Kaladial hat gesagt.:
			
		

> IWAV0052E Invocation Target Exception creating DlgUserGrpVerwaltung
> java.lang.NoSuchMethodException: DlgUserGrpVerwaltung.<init>()..


package angepasst?

EDIT: In importListData habe ich noch dies hinzugefügt:

```
if(rows != null && inSameGroup(dropIndex, rows[0], model)){
                rows = null;
                return;
            }
```
Um zu verhindern, daß Zeilen innerhalb einer Gruppe verschoben werden.
Das führt nämlich in Verbindung mit dem sort zu gefährlichen Kollisionen :wink:


----------



## Kaladial (21. Aug 2007)

hmmm hab das package komplett raus geschmissen da ich in dem projekt auch keins bzw das default package genommen hab

edit: habs jetzt ma mit nem package probiert... genau das selbe...

2. edit: geht doch ... eclipse neu gestartet gings... seltsam naja  thx


----------



## André Uhres (22. Aug 2007)

Da war noch ein Problem, wenn man Zeilen einer Gruppe auf den eigenen Titel fallen liess.
Ist jetzt gelöst (in inSameGroup hat noch ein grp.add(index); gefehlt):
DlgUserGrpVerwaltung


----------



## Kaladial (22. Aug 2007)

ok habs dazu geaddet... dank dir


----------

