我是新来的在Swing中拖放。我有一个JPanel
,它绘制了一个带有标题的图像。我想实现拖放在这个JPanel
,但经过一些文档和教程后,我没有找到任何可用的指针,说明如何完成这种类型的组件。对于初学者来说,它没有setDragEnabled
功能。实现从一个JPanel到另一个JPanel的拖放
我可以制作一个JPanel
可拖动吗?我想使用这种DnD操作将对某个对象的引用从一个面板传递到另一个面板。
我是新来的在Swing中拖放。我有一个JPanel
,它绘制了一个带有标题的图像。我想实现拖放在这个JPanel
,但经过一些文档和教程后,我没有找到任何可用的指针,说明如何完成这种类型的组件。对于初学者来说,它没有setDragEnabled
功能。实现从一个JPanel到另一个JPanel的拖放
我可以制作一个JPanel
可拖动吗?我想使用这种DnD操作将对某个对象的引用从一个面板传递到另一个面板。
您的代码示例帮助我找出解决方案!谢谢......赏金是你的! – Pieter
我很高兴知道它!别客气! –
您可以在任何JComponent
上实现拖放行为。请参阅setTransferHandler
方法。
setDragEnabled
方法通常提供给可以在JDK中实现良好默认行为的组件。在这种情况下,您可以通过调用该方法来激活默认D & D.
在JPanel
他们(= Swing开发者)可能可能不会想到任何像样的默认D行为,所以您将不得不实施自己的TransferHandler
。我强烈建议在开始之前阅读Drag-and-drop tutorial
我遇到了一些问题。以下是一些相关的代码片段:http:// pastebin。com/2UdnxSBH我看到* [DRAG]已创建Transferable [email protected]*后跟* [DROP]检测到的丢弃[email protected]*。 'Transferable'不是'DataHandler'的一个实例,这正是我所期望的。 – Pieter
也许我应该澄清一下,我试图将一个'JPanel'拖到另一个'JPanel'。 [Top-Level Drop](http://docs.oracle.com/javase/tutorial/uiswing/dnd/toplevel.html)教程仅涵盖将文件拖放到应用程序上。 – Pieter
我不知道怎么的声音可行的,但,当我需要拖放板我这样做的:
Firstable我实现动作事件dragable板和容器,它可以是既
我用一个静态变量选择父母,选择儿童和当前面板
当鼠标在面板设置为当前面板
当您单击,按下鼠标,无论你是否currentpanel被点击的一个,并设置是为孩子面板
当鼠标在面板及子面板不为空,那么看来你”重新拖拽,一旦释放鼠标,当前面板将变为父面板
您必须添加一些验证。
如果面板被拖动你可以用你自己的实现,也可能是跟随鼠标COORDS或只是强调它和突出的父母,我用这最后的选项,以模拟阻力
OK我写了这个,很奇怪,但这是这个想法:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JTextField;
/**
*
* @author porfiriopartida
*/
public class DraggablePanel extends JDesktopPane implements ContainerPanel{
public ContainerPanel parent;
static DraggablePanel over;
static ContainerPanel overParent;
static DraggablePanel dragging;
static ContainerPanel draggingParent;
public DraggablePanel(){
this(null);
}
public DraggablePanel(ContainerPanel parent){
this.parent = parent;
setBorder(BorderFactory.createLineBorder(Color.black));
setBounds(0,0,100,100);
if(parent != null)
addMouseListener(new MouseAdapter(){
@Override
public void mouseEntered(MouseEvent me) {
DraggablePanel src = (DraggablePanel) me.getSource();
DraggablePanel.over = src;
DraggablePanel.overParent = DraggablePanel.over.parent;
}
@Override
public void mouseExited(MouseEvent me) {
}
@Override
public void mouseReleased(MouseEvent me) {
if(DraggablePanel.over != null && DraggablePanel.dragging != null && DraggablePanel.overParent != null){
Rectangle bounds = DraggablePanel.dragging.getBounds();
bounds.x = me.getX();
bounds.y = me.getY();
//Remove child from parent
DraggablePanel.dragging.parent.removePanel(DraggablePanel.dragging);
if(DraggablePanel.dragging.parent != DraggablePanel.overParent){
//add child to new parent
DraggablePanel.overParent.addPanel(DraggablePanel.dragging, bounds);
}
else{
//same parent selected
DraggablePanel.dragging.parent.addPanel(DraggablePanel.dragging, bounds);
};
DraggablePanel.dragging.parent = DraggablePanel.overParent;
}
//cleaning variables
DraggablePanel.dragging = null;
DraggablePanel.over = null;
DraggablePanel.draggingParent = null;
DraggablePanel.overParent = null;
}
@Override
public void mousePressed(MouseEvent me) {
DraggablePanel.dragging = (DraggablePanel) me.getSource();
DraggablePanel.draggingParent = DraggablePanel.dragging.parent;
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent me) {
super.mouseEntered(me);
ContainerPanel src = (ContainerPanel) me.getSource();
DraggablePanel.overParent = src;
if (DraggablePanel.draggingParent == null || DraggablePanel.draggingParent == src) {
setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
} else {
setBorder(BorderFactory.createLineBorder(Color.blue, 2));
}
}
@Override
public void mouseExited(MouseEvent me) {
}
@Override
public void mouseReleased(MouseEvent me) {
}
});
}
@Override
public void addPanel(DraggablePanel panel) {
panel.parent = this;
add(panel);
repaint();
revalidate();
try {
getParent().repaint();
} catch (Exception e) {
}
}
@Override
public void addPanel(DraggablePanel panel, Rectangle bounds) {
setBounds(bounds);
addPanel(panel);
}
@Override
public void removePanel(DraggablePanel panel) {
remove(panel);
}
public static void main(String args[]){
JFrame frame = new JFrame();
frame.setLayout(new GridLayout(1,1));
JTextField tf = new JTextField("textfield");
JButton btn = new JButton("Button");
DraggablePanel desktop = new DraggablePanel();
frame.add(desktop);
DraggablePanel p1 = new DraggablePanel(desktop);
p1.setLayout(new GridLayout(2,1));
p1.add(tf);
p1.setBounds(0,0,100,50);
tf.setBounds(5,5,80,30);
DraggablePanel p2 = new DraggablePanel(desktop);
p2.setLayout(new GridLayout(2,1));
p2.add(btn);
p2.setBounds(50,50,50,30);
btn.setBounds(5,5,30,20);
desktop.add(p1);
desktop.add(p2);
frame.setPreferredSize(new Dimension(600,400));
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
*“我可以使JPanel拖动吗?”*它的可拖动的,如果添加到'JList'。 –
http://www.bryanesmith.com/documents/drag-and-drop-panel-demo/index.html? – StanislavL
尼斯链接@StanislavL – Robin