我是新來的在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