Java 在Swing中将JButton从一个JPanel切换到另一个JPanel

Java 在Swing中将JButton从一个JPanel切换到另一个JPanel,java,swing,drag-and-drop,jpanel,jbutton,Java,Swing,Drag And Drop,Jpanel,Jbutton,我尝试将一个按钮从面板上拖放到另一个面板上。一切都已经习惯了。但我想我错过了什么。 两者都有“网格布局” 这两个都是100%的按钮文件。 我已经实现了一个MouseMotionListener,它工作得非常好。我可以在面板内移动按钮。但如果我想离开面板,按钮就会消失。 如果我一直拖动它,我可以将它向后移动,但一旦按钮离开面板,我就看不到它了 有没有一个简单的解决办法,我错过了 这是我第一次创建一个最小的示例,希望可以 import java.awt.Color; import java.awt.

我尝试将一个按钮从面板上拖放到另一个面板上。一切都已经习惯了。但我想我错过了什么。 两者都有“网格布局” 这两个都是100%的按钮文件。 我已经实现了一个MouseMotionListener,它工作得非常好。我可以在面板内移动按钮。但如果我想离开面板,按钮就会消失。 如果我一直拖动它,我可以将它向后移动,但一旦按钮离开面板,我就看不到它了

有没有一个简单的解决办法,我错过了

这是我第一次创建一个最小的示例,希望可以

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.TransferHandler;

//this class works perfekt
class TileRackListener implements MouseMotionListener {

    public void mouseDragged(MouseEvent argEvent) {
        System.out.println("(" + argEvent.getX() + "," + argEvent.getY() + ")");

        if (argEvent.getX() < 0 || argEvent.getY() < 0) {
            Rectangle objBounds = argEvent.getComponent().getBounds();
            argEvent.getComponent().setLocation(objBounds.x + argEvent.getX(),
                    objBounds.y + argEvent.getY());
        } else {

            Rectangle objBounds = argEvent.getComponent().getBounds();
            if (objBounds.x <= objBounds.x + argEvent.getX()
                    && objBounds.x + argEvent.getX() <= objBounds.x
                            + objBounds.width
                    && objBounds.y <= objBounds.y + argEvent.getY()
                    && objBounds.y + argEvent.getY() <= objBounds.y
                            + objBounds.height) {
                argEvent.getComponent().setLocation(
                        objBounds.x + argEvent.getX(),
                        objBounds.y + argEvent.getY());
            } else {
                argEvent.getComponent().setLocation(argEvent.getX(),
                        argEvent.getY());
            }
        }

        argEvent.getComponent().transferFocus();
        ;

        argEvent.getComponent().repaint();

    }

    @Override
    public void mouseMoved(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

}

class ButtonCell extends JButton {
    private char letter;
    private int value;
    private Image iconImage;

    public void setIconImage(Image image) {
        this.iconImage = image;
        ImageIcon icon = new ImageIcon(image);
        setIcon(icon);
        setDisabledIcon(icon);
    }

}

class TestPane extends JPanel {

    //Custom Motion Listener
    private TileRackListener motionListener = new TileRackListener();
    private ButtonCell[] field;
    private static final int COLUMN_COUNT =2 ;
    private int width = 100;
    private int height = 32;
    private int buttonSize = 50;
    public TestPane() {
        field = new ButtonCell[COLUMN_COUNT];
        setBounds(new Rectangle(width, height));
        setLayout(new GridLayout(0, 7));
        setBackground(new Color(139, 69, 19));

        for (int i = 0; i < field.length; i++) {
            field[i] = new ButtonCell();
            field[i].setBackground(new Color(139, 69, 19));
            field[i].setBounds(new Rectangle(buttonSize, buttonSize));
            field[i].setTransferHandler(new TransferHandler("Text"));
            field[i].addMouseMotionListener(motionListener);
            add(field[i]);
        }
    }
}

public class main {

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                frame.setVisible(true);
                frame.setBackground(new Color(0, 128, 0));
                frame.setBounds(new Rectangle(200, 200));
                frame.setLayout(null);

                TestPane first = new TestPane();
                first.setLocation(10, 10);
                TestPane second = new TestPane();
                second.setLocation(10, 100);
                frame.add(first);

                frame.setVisible(true);

                frame.add(second);

            }
        });

    }
}
导入java.awt.Color;
导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入java.awt.Image;
导入java.awt.Rectangle;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseMotionListener;
导入javax.swing.ImageIcon;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.TransferHandler;
//这门课学得很好
类TileRackListener实现MouseMotionListener{
公共无效mouseDragged(MouseEvent argEvent){
System.out.println(“(“+argEvent.getX()+”,“+argEvent.getY()+”);
if(argEvent.getX()<0 | | argEvent.getY()<0){
矩形objBounds=argEvent.getComponent().getBounds();
argEvent.getComponent().setLocation(objBounds.x+argEvent.getX(),
objBounds.y+argEvent.getY());
}否则{
矩形objBounds=argEvent.getComponent().getBounds();

如果(objBounds.x)想要更快地获得更好的帮助,请发布一个(最小完整和可验证的示例)。我添加了您要求的内容。我希望可以,否则请说出来