java拖放 [英] java drag and drop

查看:180
本文介绍了java拖放的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试在java中拖放,但我发现的所有教程都是...(让我生气)



我想要的是拖动来自JList的PublicUserLabel(包含在自制的JPanel中,名为UserPanel),并将其放在从JTabbedPanel中强制转换的自制类中。
拖动对象本身而不是其字符串表示非常重要!!!



这是我到目前为止:
PublicUserLabel

  public class PublicUserLabel extends JLabel implements DragSourceListener,DragGestureListener,Transferable 
{
private DragSource ds;
private PublicUser用户;

public PublicUserLabel(PublicUser user)
{
super(user.getName());
this.user = user;
ds = new DragSource();
ds.createDefaultDragGestureRecognizer(this,DnDConstants.ACTION_COPY_OR_MOVE,this);
}

@Override
public void dragGestureRecognized(DragGestureEvent e)
{
ds.startDrag(e,DragSource.DefaultCopyDrop,this,this);


@Override
public Object getTransferData(DataFlavor flavor)throws UnsupportedFlavorException,IOException
{
if(flavor.equals(PublicUserFlavor.publicUserFlavor))
{
return this; // TODO?
}
抛出新的UnsupportedFlavorException(flavor);
}

@Override
public DataFlavor [] getTransferDataFlavors()
{
DataFlavor [] df = new DataFlavor [2];
df [0] = DataFlavor.stringFlavor;
df [1] = PublicUserFlavor.publicUserFlavor;
return df;
}

@Override
public boolean isDataFlavorSupported(DataFlavor flavor)
{
return flavor.equals(PublicUserFlavor.publicUserFlavor);
}

//更多方法
}

UserPanel:

  public class UserPanel extends JPanel 
{
private JTextField search;
私人列表< PublicUser> ALLUSER;
private JList< PublicUserLabel>列表;
private JScrollPane scrollPane;
private DefaultListModel< PublicUserLabel> ListModel的;

public UserPanel()
{
allUser = new LinkedList< PublicUser>();
listModel = new DefaultListModel< PublicUserLabel>();
list = new JList< PublicUserLabel>(listModel);
list.setDragEnabled(true);

PublicUserFlavor:

 code> public class PublicUserFlavor extends DataFlavor 
{
public static DataFlavor publicUserFlavor;

static
{
publicUserFlavor = new DataFlavor(PublicUser.class,PublicUser);
}
}

TabPanel:

  public class TabPanel extends JTabbedPane implements DropTargetListener 
{
public TabPanel()
{
setTabPlacement(JTabbedPane.BOTTOM) ;
addNewTabComponent(bla);
addNewTabComponent(blub);
setDropTarget(new DropTarget(this,this));
}

@Override
public void drop(DropTargetDropEvent e)
{
可传递转移= e.getTransferable();
if(transferable.isDataFlavorSupported(PublicUserFlavor.publicUserFlavor))
{
e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
try
{
Object o = transferable.getTransferData(PublicUserFlavor.publicUserFlavor);
System.out.println(o);
if(o instanceof PublicUserLabel)
{
PublicUserLabel l =(PublicUserLabel)o;
PublicUser u = l.getUser();
System.out.println(u);
}
}
catch(UnsupportedFlavorException e1)
{
// TODO自动生成的catch块
e1.printStackTrace();
}
catch(IOException e1)
{
// TODO自动生成的catch块
e1.printStackTrace();
}
e.getDropTargetContext()。dropComplete(true);
}
}

在drop方法中有一些syso将被执行如果用户被放在面板中。但事实并非如此。我做的事情完全错了吗?
感谢您的帮助!

解决方案

我可以看到的主要问题是您正在混合两种不同的API。您正在使用低级别的D'n'D API和较新的组件D'n'DAPI。



个人而言,较新的API会让我失望,所以我倾向于避免它。



我不明白为什么你需要转移标签,最好转移底层的 PublicUser 对象,但这只是我。



  import java.awt.BorderLayout; 
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragGestureRecognizer;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.IOException;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestDnD {

public static void main(String [] args){
new TestDnD();
}

public TestDnD(){
EventQueue.invokeLater(new Runnable(){
@Override
public void run(){
尝试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch(ClassNotFoundException ex){
} catch(InstantiationException ex){
} catch(IllegalAccessException ex) {
} catch(UnsupportedLookAndFeelException ex){
}

JFrame frame = new JFrame(Test);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

});
}

public class TestPane扩展JPanel {

private JList list;

public TestPane(){
setLayout(new BorderLayout());
list = new JList();
DefaultListModel model = new DefaultListModel();
model.addElement(new User(Shaun));
model.addElement(new User(Andy));
model.addElement(new User(Luke));
model.addElement(new User(Han));
model.addElement(new User(Liea));
model.addElement(new User(Yoda));
list.setModel(model);
add(new JScrollPane(list),BorderLayout.WEST);

DragGestureRecognizer dgr = DragSource.getDefaultDragSource()。createDefaultDragGestureRecognizer(
list,
DnDConstants.ACTION_COPY_OR_MOVE,
new DragGestureHandler(list));

JPanel panel = new JPanel(new GridBagLayout());
add(panel);

DropTarget dt = new DropTarget(
panel,
DnDConstants.ACTION_COPY_OR_MOVE,
new DropTargetHandler(panel),
true);

}

}

public static class User {

private String name;

public User(String name){
this.name = name;
}

public String getName(){
return name;
}

@Override
public String toString(){
return name;
}

}

public static class UserTransferable implements Transferable {

public static final DataFlavor USER_DATA_FLAVOR = new DataFlavor(User.class, 用户);
私人用户用户;

public UserTransferable(用户用户){
this.user = user;
}

@Override
public DataFlavor [] getTransferDataFlavors(){
返回新的DataFlavor [] {USER_DATA_FLAVOR};
}

@Override
public boolean isDataFlavorSupported(DataFlavor flavor){
return USER_DATA_FLAVOR.equals(flavor);
}

@Override
public Object getTransferData(DataFlavor flavor)throws UnsupportedFlavorException,IOException {
Object value = null;
if(USER_DATA_FLAVOR.equals(flavor)){
value = user;
} else {
throw new UnsupportedFlavorException(flavor);
}
返回值;
}

}

保护类DragGestureHandler实现DragGestureListener {

private JList list;

public DragGestureHandler(JList list){
this.list = list;
}

@Override
public void dragGestureRecognized(DragGestureEvent dge){
Object selectedValue = list.getSelectedValue();
if(selectedValue instanceof User){
User user =(User)selectedValue;
可转移t = new UserTransferable(user);
DragSource ds = dge.getDragSource();
ds.startDrag(
dge,
null,
t,
new DragSourceHandler());
}

}

}

保护类DragSourceHandler实现DragSourceListener {

public void dragEnter(DragSourceDragEvent dsde){
}

public void dragOver(DragSourceDragEvent dsde){
}

public void dropActionChanged(DragSourceDragEvent dsde){
}

public void dragExit(DragSourceEvent dse){
}

public void dragDropEnd(DragSourceDropEvent dsde){

System.out.println (拖曳...);

}

}

保护类DropTargetHandler实现DropTargetListener {

private JPanel panel;

public DropTargetHandler(JPanel panel){
this.panel = panel;
}

public void dragEnter(DropTargetDragEvent dtde){
if(dtde.getTransferable()。isDataFlavorSupported(UserTransferable.USER_DATA_FLAVOR)){
System.out.println (接受...);
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
System.out.println(Drag ...);
dtde.rejectDrag();
}
}

public void dragOver(DropTargetDragEvent dtde){
}

public void dropActionChanged(DropTargetDragEvent dtde){
}

public void dragExit(DropTargetEvent dte){
}

public void drop(DropTargetDropEvent dtde){
System.out.println(下降......);
if(dtde.getTransferable()。isDataFlavorSupported(UserTransferable.USER_DATA_FLAVOR)){
可传递t = dtde.getTransferable();
if(t.isDataFlavorSupported(UserTransferable.USER_DATA_FLAVOR)){
try {
Object transferData = t.getTransferData(UserTransferable.USER_DATA_FLAVOR);
if(transferData instanceof User){
User user =(User)transferData;
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
panel.add(new JLabel(user.getName()));
panel.revalidate();
panel.repaint();
} else {
dtde.rejectDrop();
}
} catch(UnsupportedFlavorException ex){
ex.printStackTrace();
dtde.rejectDrop();
} catch(IOException ex){
ex.printStackTrace();
dtde.rejectDrop();
}
} else {
dtde.rejectDrop();
}
}
}

}

}


I try to get familar with drag and drop in java but all the tutorials I found were... (getting me angry)

All I want is to drag a "PublicUserLabel" from a JList (included in a selfmade JPanel called "UserPanel") and drop it in a selfmade class inerited from JTabbedPanel. It is very important to drag the object itself and not its stringrepresentation!!!

That is what I have so far: PublicUserLabel

public class PublicUserLabel extends JLabel implements DragSourceListener, DragGestureListener, Transferable
    {
        private DragSource ds;
        private PublicUser user;

        public PublicUserLabel(PublicUser user)
        {
            super(user.getName());
            this.user = user;
            ds = new DragSource();
            ds.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY_OR_MOVE, this);
        }

        @Override
        public void dragGestureRecognized(DragGestureEvent e)
        {
            ds.startDrag(e, DragSource.DefaultCopyDrop, this, this);
        }

        @Override
        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException
        {
            if (flavor.equals(PublicUserFlavor.publicUserFlavor))
            {
                return this;//TODO ?
            }
            throw new UnsupportedFlavorException(flavor);
        }

        @Override
        public DataFlavor[] getTransferDataFlavors()
        {
            DataFlavor[] df = new DataFlavor[2];
            df[0] = DataFlavor.stringFlavor;
            df[1] = PublicUserFlavor.publicUserFlavor;
            return df;
        }

        @Override
        public boolean isDataFlavorSupported(DataFlavor flavor)
        {
            return flavor.equals(PublicUserFlavor.publicUserFlavor);
        }

    //some more methods
    }

UserPanel:

public class UserPanel extends JPanel
{
    private JTextField search;
    private List<PublicUser> allUser;
    private JList<PublicUserLabel> list;
    private JScrollPane scrollPane;
    private DefaultListModel<PublicUserLabel> listModel;

    public UserPanel()
    {
        allUser = new LinkedList<PublicUser>();
        listModel = new DefaultListModel<PublicUserLabel>();
        list = new JList<PublicUserLabel>(listModel);
        list.setDragEnabled(true);

PublicUserFlavor:

public class PublicUserFlavor extends DataFlavor
{
    public static DataFlavor publicUserFlavor;

    static
    {
        publicUserFlavor = new DataFlavor(PublicUser.class, "PublicUser");
    }
}

TabPanel:

public class TabPanel extends JTabbedPane implements DropTargetListener
{
    public TabPanel()
    {
        setTabPlacement(JTabbedPane.BOTTOM);
        addNewTabComponent("bla");
        addNewTabComponent("blub");
        setDropTarget(new DropTarget(this, this));
    }

    @Override
    public void drop(DropTargetDropEvent e)
    {
        Transferable transferable = e.getTransferable();
        if (transferable.isDataFlavorSupported(PublicUserFlavor.publicUserFlavor))
        {
            e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
            try
            {
                Object o = transferable.getTransferData(PublicUserFlavor.publicUserFlavor);
                System.out.println(o);
                if (o instanceof PublicUserLabel)
                {
                    PublicUserLabel l = (PublicUserLabel)o;
                    PublicUser u = l.getUser();
                    System.out.println(u);
                }
            }
            catch (UnsupportedFlavorException e1)
            {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            catch (IOException e1)
            {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            e.getDropTargetContext().dropComplete(true);
        }
    }

In the drop method are some syso's that shall be executed if a User is droped in the panel. But that is not the fact. Am I doing something completly wrong? Thank you for helping!

解决方案

The major issues I can see are you are mixing two different API's. You're using both the low level D'n'D API and the newer "component D'n'D" API.

Personally, the newer API annoys me, so I tend to avoid it.

I can't see why you need to transfer the label, when it would be better to transfer the underlying PublicUser object, but that's just me.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragGestureRecognizer;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.IOException;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestDnD {

    public static void main(String[] args) {
        new TestDnD();
    }

    public TestDnD() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class TestPane extends JPanel {

        private JList list;

        public TestPane() {
            setLayout(new BorderLayout());
            list = new JList();
            DefaultListModel model = new DefaultListModel();
            model.addElement(new User("Shaun"));
            model.addElement(new User("Andy"));
            model.addElement(new User("Luke"));
            model.addElement(new User("Han"));
            model.addElement(new User("Liea"));
            model.addElement(new User("Yoda"));
            list.setModel(model);
            add(new JScrollPane(list), BorderLayout.WEST);

            DragGestureRecognizer dgr = DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(
                            list,
                            DnDConstants.ACTION_COPY_OR_MOVE,
                            new DragGestureHandler(list));

            JPanel panel = new JPanel(new GridBagLayout());
            add(panel);

            DropTarget dt = new DropTarget(
                            panel,
                            DnDConstants.ACTION_COPY_OR_MOVE,
                            new DropTargetHandler(panel),
                            true);

        }

    }

    public static class User {

        private String name;

        public User(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        @Override
        public String toString() {
            return name;
        }

    }

    public static class UserTransferable implements Transferable {

        public static final DataFlavor USER_DATA_FLAVOR = new DataFlavor(User.class, "User");
        private User user;

        public UserTransferable(User user) {
            this.user = user;
        }

        @Override
        public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[]{USER_DATA_FLAVOR};
        }

        @Override
        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return USER_DATA_FLAVOR.equals(flavor);
        }

        @Override
        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
            Object value = null;
            if (USER_DATA_FLAVOR.equals(flavor)) {
                value = user;
            } else {
                throw new UnsupportedFlavorException(flavor);
            }
            return value;
        }

    }

    protected class DragGestureHandler implements DragGestureListener {

        private JList list;

        public DragGestureHandler(JList list) {
            this.list = list;
        }

        @Override
        public void dragGestureRecognized(DragGestureEvent dge) {
            Object selectedValue = list.getSelectedValue();
            if (selectedValue instanceof User) {
                User user = (User) selectedValue;
                Transferable t = new UserTransferable(user);
                DragSource ds = dge.getDragSource();
                ds.startDrag(
                                dge,
                                null,
                                t,
                                new DragSourceHandler());
            }

        }

    }

    protected class DragSourceHandler implements DragSourceListener {

        public void dragEnter(DragSourceDragEvent dsde) {
        }

        public void dragOver(DragSourceDragEvent dsde) {
        }

        public void dropActionChanged(DragSourceDragEvent dsde) {
        }

        public void dragExit(DragSourceEvent dse) {
        }

        public void dragDropEnd(DragSourceDropEvent dsde) {

            System.out.println("Drag ended...");

        }

    }

    protected class DropTargetHandler implements DropTargetListener {

        private JPanel panel;

        public DropTargetHandler(JPanel panel) {
            this.panel = panel;
        }

        public void dragEnter(DropTargetDragEvent dtde) {
            if (dtde.getTransferable().isDataFlavorSupported(UserTransferable.USER_DATA_FLAVOR)) {
                System.out.println("Accept...");
                dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
            } else {
                System.out.println("Drag...");
                dtde.rejectDrag();
            }
        }

        public void dragOver(DropTargetDragEvent dtde) {
        }

        public void dropActionChanged(DropTargetDragEvent dtde) {
        }

        public void dragExit(DropTargetEvent dte) {
        }

        public void drop(DropTargetDropEvent dtde) {
            System.out.println("Dropped...");
            if (dtde.getTransferable().isDataFlavorSupported(UserTransferable.USER_DATA_FLAVOR)) {
                Transferable t = dtde.getTransferable();
                if (t.isDataFlavorSupported(UserTransferable.USER_DATA_FLAVOR)) {
                    try {
                        Object transferData = t.getTransferData(UserTransferable.USER_DATA_FLAVOR);
                        if (transferData instanceof User) {
                            User user = (User) transferData;
                            dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                            panel.add(new JLabel(user.getName()));
                            panel.revalidate();
                            panel.repaint();
                        } else {
                            dtde.rejectDrop();
                        }
                    } catch (UnsupportedFlavorException ex) {
                        ex.printStackTrace();
                        dtde.rejectDrop();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                        dtde.rejectDrop();
                    }
                } else {
                    dtde.rejectDrop();
                }
            }
        }

    }

}

这篇关于java拖放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆