4

Swing でのドラッグ アンド ドロップは初めてです。JPanelキャプションが重ねられた画像を描画する があります。これにドラッグ アンド ドロップを実装したいのですJPanelが、いくつかのドキュメントとチュートリアルを調べた後、このタイプのコンポーネントでどのように行われるかについての使用可能なポインターが見つかりませんでした。まず、機能がありませんsetDragEnabled

JPanelドラッグ可能にすることはできますか? この DnD 操作を使用して、特定のオブジェクトへの参照をあるパネルから別のパネルに渡したいと考えています。

4

3 に答える 3

3

任意の にドラッグ アンド ドロップ動作を実装できますJComponentsetTransferHandlerメソッドを参照してください。

このsetDragEnabledメソッドは通常、JDK で適切なデフォルトの D&D 動作を実装できるコンポーネントで提供されます。そのような場合、そのメソッドを呼び出すことで、デフォルトの D&D を有効にすることができます。

JPanel彼ら (= Swing 開発者) はおそらく適切なデフォルトの D&D 動作を思いつかないので、独自の を実装する必要がありますTransferHandler。開始する前に、ドラッグアンドドロップのチュートリアルを読むことを強くお勧めします

于 2012-05-08T13:17:35.933 に答える
3

これはあなたを助けることができるかもしれません。

Java での複雑なカスタム オブジェクトのドラッグ アンド ドロップ

于 2012-05-17T14:08:16.113 に答える
1

どれだけ実行可能かはわかりませんが、パネルをドラッグアンドドロップする必要があるときは、次のようにしました。

まず、ドラッグ可能なパネルとコンテナーのアクション イベントを実装しました。

選択した親、選択した子、および現在のパネルに静的変数を使用しました

マウスがパネルの上にあるとき、それを現在のパネルとして設定します

クリックしたとき、マウスダウンしたときなど、現在のパネルがクリックされたものであり、子パネルとして設定されているかどうかを確認します

マウスがパネル上にあり、子パネルがnullでない場合、ドラッグしているように見えます。マウスを離すと、現在のパネルが親パネルに変わります

いくつかの検証を追加する必要があります。

パネルがドラッグされている場合は、独自の実装を使用できます。マウスの座標に従うか、それを強調表示して親を強調表示することができます。この最後のオプションを使用して、ドラッグをシミュレートしました。


わかりました私はこれを書きました、とてもバグがありますが、これはアイデアです:

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);
    }
}
于 2012-05-17T18:51:02.767 に答える