Java 在Swing中将JButton从一个JPanel切换到另一个JPanel
我尝试将一个按钮从面板上拖放到另一个面板上。一切都已经习惯了。但我想我错过了什么。 两者都有“网格布局” 这两个都是100%的按钮文件。 我已经实现了一个MouseMotionListener,它工作得非常好。我可以在面板内移动按钮。但如果我想离开面板,按钮就会消失。 如果我一直拖动它,我可以将它向后移动,但一旦按钮离开面板,我就看不到它了 有没有一个简单的解决办法,我错过了 这是我第一次创建一个最小的示例,希望可以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.
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)想要更快地获得更好的帮助,请发布一个(最小完整和可验证的示例)。我添加了您要求的内容。我希望可以,否则请说出来