Java 在面板中单击鼠标时,存储图像图标的JLabel将返回到原始位置
我已将此侦听器添加到JLabel中,我能够完美地拖动图像,但是,只要我单击面板(在不存在JLabel的区域),标签就会返回到其原始位置。我不明白为什么会这样。请帮帮我,我已经花了好几个小时在这上面了。谢谢Java 在面板中单击鼠标时,存储图像图标的JLabel将返回到原始位置,java,swing,jlabel,imageicon,drag-and-drop,Java,Swing,Jlabel,Imageicon,Drag And Drop,我已将此侦听器添加到JLabel中,我能够完美地拖动图像,但是,只要我单击面板(在不存在JLabel的区域),标签就会返回到其原始位置。我不明白为什么会这样。请帮帮我,我已经花了好几个小时在这上面了。谢谢 public class CardLabelListener extends MouseAdapter { private MouseEvent initiateEvent = null; @Override public void mouseReleased(Mo
public class CardLabelListener extends MouseAdapter {
private MouseEvent initiateEvent = null;
@Override
public void mouseReleased(MouseEvent me) {
System.err.println("mouse release");
int dx = me.getX() - initiateEvent.getX();
int dy = me.getY() - initiateEvent.getY();
if (Math.abs(dx) > 5 || Math.abs(dy) > 5) {
Rectangle oldBound = me.getComponent().getBounds();
int newX = oldBound.x + dx;
int newY = oldBound.y + dy;
me.getComponent().setBounds(newX, newY, oldBound.width, oldBound.height);
}
initiateEvent = null;
}
public void mousePressed(MouseEvent me) {
GreetingCard.setBackground.findComponentAt(me.getX(), me.getY());
System.err.println("mouse pressed");
initiateEvent = me;
me.consume();
}
public void mouseDragged(MouseEvent me) {
System.err.println(me.getSource());
if (initiateEvent == null) return;
me.consume();
JComponent jc = (JComponent) me.getSource();
TransferHandler handler = jc.getTransferHandler();
handler.exportAsDrag(jc, me, TransferHandler.MOVE);
initiateEvent = null;
}
}
为此,您需要在
JLabel
所在的容器上使用null
布局,否则该位置将重置为当前布局管理器放置标签的位置
更好的方法是使用
DragLayout设计用于替换空布局。它将考虑组件的位置。默认情况下,它将使用组件的首选大小来确定其大小。最后,它将自动计算容器的首选大小
为此,您需要在
JLabel
所在的容器上使用null
布局,否则该位置将重置为当前布局管理器放置标签的位置
更好的方法是使用
DragLayout设计用于替换空布局。它将考虑组件的位置。默认情况下,它将使用组件的首选大小来确定其大小。最后,它将自动计算容器的首选大小
首先,您没有拖动图标,而是拖动组件本身 其次,您要对抗包含标签组件的布局管理器。当面板失效时,标签将返回到其原始布局位置 试着用类似a的东西把你的标签放进去 根据反馈更新了示例
public class MoveMe {
public static void main(String[] args) {
new MoveMe();
}
public MoveMe() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new MoveMePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class MoveMePane extends JLayeredPane {
public MoveMePane() {
int width = 400;
int height = 400;
for (int index = 0; index < 10; index++) {
String text = "Label " + index;
JLabel label = new JLabel(text);
label.setSize(label.getPreferredSize());
int x = (int) Math.round(Math.random() * width);
int y = (int) Math.round(Math.random() * height);
if (x + label.getWidth() > width) {
x = width - label.getWidth();
}
if (y + label.getHeight() > width) {
y = width - label.getHeight();
}
label.setLocation(x, y);
add(label);
}
MoveMeMouseHandler handler = new MoveMeMouseHandler();
addMouseListener(handler);
addMouseMotionListener(handler);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
}
public class MoveMeMouseHandler extends MouseAdapter {
private int xOffset;
private int yOffset;
private JLabel draggy;
private String oldText;
@Override
public void mouseReleased(MouseEvent me) {
if (draggy != null) {
draggy.setText(oldText);
draggy.setSize(draggy.getPreferredSize());
draggy = null;
}
}
public void mousePressed(MouseEvent me) {
JComponent comp = (JComponent) me.getComponent();
Component child = comp.findComponentAt(me.getPoint());
if (child instanceof JLabel) {
xOffset = me.getX() - child.getX();
yOffset = me.getY() - child.getY();
draggy = (JLabel) child;
oldText = draggy.getText();
draggy.setText("What a drag");
draggy.setSize(draggy.getPreferredSize());
}
}
public void mouseDragged(MouseEvent me) {
if (draggy != null) {
draggy.setLocation(me.getX() - xOffset, me.getY() - yOffset);
}
}
}
}
公共类MoveMe{
公共静态void main(字符串[]args){
新MoveMe();
}
公共运动{
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}捕获(ClassNotFoundException ex){
}catch(实例化异常){
}捕获(非法访问例外){
}捕获(无支持的LookandFeelexception ex){
}
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(newmovemepane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类MoveMePane扩展了JLayeredPane{
公共移动窗格(){
整数宽度=400;
内部高度=400;
对于(int-index=0;index<10;index++){
String text=“Label”+索引;
JLabel标签=新的JLabel(文本);
label.setSize(label.getPreferredSize());
int x=(int)Math.round(Math.random()*宽度);
int y=(int)Math.round(Math.random()*高度);
如果(x+label.getWidth()>width){
x=width-label.getWidth();
}
如果(y+label.getHeight()>width){
y=宽度-label.getHeight();
}
标签设置位置(x,y);
添加(标签);
}
MoveMeMouseHandler=新的MoveMeMouseHandler();
addMouseListener(handler);
addMouseMotionListener(处理程序);
}
@凌驾
公共维度getPreferredSize(){
返回新维度(400400);
}
}
公共类MoveMeMouseHandler扩展了MouseApter{
私有int-xOffset;
私人内部补偿;
二等兵杰拉贝尔·德拉吉;
私有字符串oldText;
@凌驾
公共无效MouseEvent me(MouseEvent me){
if(draggy!=null){
draggy.setText(旧文本);
draggy.setSize(draggy.getPreferredSize());
draggy=null;
}
}
public void mousePressed(MouseEvent me){
JComponent comp=(JComponent)me.getComponent();
Component child=comp.findComponentAt(me.getPoint());
if(JLabel的子实例){
xOffset=me.getX()-child.getX();
yOffset=me.getY()-child.getY();
draggy=(JLabel)儿童;
oldText=draggy.getText();
draggy.setText(“真讨厌”);
draggy.setSize(draggy.getPreferredSize());
}
}
公共无效鼠标标记(MouseEvent me){
if(draggy!=null){
setLocation(me.getX()-xOffset,me.getY()-yOffset);
}
}
}
}
首先,您不是在拖动图标,而是在拖动组件本身
其次,您要对抗包含标签组件的布局管理器。当面板失效时,标签将返回到其原始布局位置
试着用类似a的东西把你的标签放进去
根据反馈更新了示例
public class MoveMe {
public static void main(String[] args) {
new MoveMe();
}
public MoveMe() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new MoveMePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class MoveMePane extends JLayeredPane {
public MoveMePane() {
int width = 400;
int height = 400;
for (int index = 0; index < 10; index++) {
String text = "Label " + index;
JLabel label = new JLabel(text);
label.setSize(label.getPreferredSize());
int x = (int) Math.round(Math.random() * width);
int y = (int) Math.round(Math.random() * height);
if (x + label.getWidth() > width) {
x = width - label.getWidth();
}
if (y + label.getHeight() > width) {
y = width - label.getHeight();
}
label.setLocation(x, y);
add(label);
}
MoveMeMouseHandler handler = new MoveMeMouseHandler();
addMouseListener(handler);
addMouseMotionListener(handler);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
}
public class MoveMeMouseHandler extends MouseAdapter {
private int xOffset;
private int yOffset;
private JLabel draggy;
private String oldText;
@Override
public void mouseReleased(MouseEvent me) {
if (draggy != null) {
draggy.setText(oldText);
draggy.setSize(draggy.getPreferredSize());
draggy = null;
}
}
public void mousePressed(MouseEvent me) {
JComponent comp = (JComponent) me.getComponent();
Component child = comp.findComponentAt(me.getPoint());
if (child instanceof JLabel) {
xOffset = me.getX() - child.getX();
yOffset = me.getY() - child.getY();
draggy = (JLabel) child;
oldText = draggy.getText();
draggy.setText("What a drag");
draggy.setSize(draggy.getPreferredSize());
}
}
public void mouseDragged(MouseEvent me) {
if (draggy != null) {
draggy.setLocation(me.getX() - xOffset, me.getY() - yOffset);
}
}
}
}
公共类MoveMe{
公共静态void main(字符串[]args){
新MoveMe();
}
公共运动{
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}捕获(ClassNotFoundException ex){
}catch(实例化异常){
}捕获(非法访问)