拖放JPanel的下降不会下降
问题描述:
基本上,我试图拖放一个JPanel,其中包含一个JLabel:拖放JPanel的下降不会下降
这里是阻力的样品和下降代码,我已经实现了:
public class TestDragAndDropPanel extends JPanel{
private static final long serialVersionUID = 1L;
Border borderContainer = BorderFactory.createMatteBorder(2, 2, 2, 2, Color.BLACK);
private DataFlavor dataFlavor = new DataFlavor(TestDragAndDropPanel.class, "TestDragAndDropPanel");
public TestDragAndDropPanel(){
JPanel mainDragPanel = new JPanel();
mainDragPanel.setBorder(borderContainer);
JPanel mainDropPanel = new JPanel();
mainDropPanel.setBorder(borderContainer);
JPanel draggablePanel = new JPanel();
draggablePanel.setBorder(borderContainer);
JLabel draggableTitle = new JLabel("This is Draggable");
JLabel draggableTitle2 = new JLabel("Another Component");
draggablePanel.add(draggableTitle);
draggablePanel.add(draggableTitle2);
JPanel droppablePanel = new JPanel();
droppablePanel.setBorder(borderContainer);
JLabel droppableTitle = new JLabel("This is Droppable");
JLabel droppableTitle2 = new JLabel("Another Component 2");
droppablePanel.add(droppableTitle);
droppablePanel.add(droppableTitle2);
mainDragPanel.add(draggablePanel);
mainDropPanel.add(droppablePanel);
this.add(mainDragPanel);
this.add(mainDropPanel);
init(mainDropPanel, draggablePanel);
}
private void init(JPanel mainDropPanel, JPanel draggablePanel) {
DragSource ds = new DragSource();
ds.createDefaultDragGestureRecognizer(draggablePanel, DnDConstants.ACTION_MOVE, new DragGestureListImp());
new MyDropTargetListImp(mainDropPanel);
}
private class TransferablePanel implements Transferable {
private JPanel transferablePanel;
public TransferablePanel(JPanel transferablePanel) {
this.transferablePanel = transferablePanel;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { dataFlavor };
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(dataFlavor);
}
@Override
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {
if (flavor.equals(dataFlavor)){
return transferablePanel;
} else {
throw new UnsupportedFlavorException(flavor);
}
}
}
private class DragGestureListImp implements DragGestureListener {
@Override
public void dragGestureRecognized(DragGestureEvent event) {
Cursor cursor = null;
JPanel panel = (JPanel) event.getComponent();
if (event.getDragAction() == DnDConstants.ACTION_MOVE) {
cursor = DragSource.DefaultMoveDrop;
}
event.startDrag(cursor, new TransferablePanel(panel));
}
}
private class MyDropTargetListImp extends DropTargetAdapter implements DropTargetListener {
private DropTarget dropTarget;
private JPanel panel;
public MyDropTargetListImp(JPanel panel) {
this.panel = panel;
dropTarget = new DropTarget(panel, DnDConstants.ACTION_MOVE, this,
true, null);
}
public void drop(DropTargetDropEvent event) {
try {
Transferable tr = event.getTransferable();
JPanel an = (JPanel) tr.getTransferData(dataFlavor);
if (event.isDataFlavorSupported(dataFlavor)) {
event.acceptDrop(DnDConstants.ACTION_MOVE);
this.panel.add(an);
event.dropComplete(true);
this.panel.validate();
this.panel.repaint();
return;
}
event.rejectDrop();
} catch (Exception e) {
e.printStackTrace();
event.rejectDrop();
}
}
}
public static void main(String[] args){
System.out.println("Application Running");
JPanel testDragAndDropPanel = new TestDragAndDropPanel();
JFrame mainframe = new JFrame();
mainframe.add(testDragAndDropPanel);
mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainframe.setSize(300,200);
mainframe.setVisible(true);
}
}
基本上,没有什么似乎发生在放弃的一面,有谁能告诉我为什么?
谢谢,
答
你确定什么都没有发生?如果您在放下面板后最大化了窗口,那么您会看到更改。问题是你没有重新验证放置面板。
在你drop
方法,更换这部分
if (event.isDataFlavorSupported(dataFlavor)) {
event.acceptDrop(DnDConstants.ACTION_MOVE);
this.panel.add(an);
event.dropComplete(true);
this.panel.validate();
this.panel.repaint();
return;
}
与此
if (event.isDataFlavorSupported(dataFlavor)) {
event.acceptDrop(DnDConstants.ACTION_MOVE);
panel.add(an);
panel.revalidate();
event.dropComplete(true);
return;
}
啊,好一个 - 为什么没有验证这个工作呢?你什么时候会使用验证? – maloney
在Swing应用程序中,大部分时间应该使用'revalidate'(有时可能会紧跟'repaint',取决于大小写,您应该试验一下) – Rempelos