gpt4 book ai didi

java - 用于拖放的 JLabel 鼠标事件

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:44:04 25 4
gpt4 key购买 nike

我想通过覆盖 JLabel 上的鼠标事件来启用 JLabel 上的拖放功能,但是当我在 mousePressed 事件中定义拖放时,mouseReleased 不会对该 JLabel 生效。我做错了什么吗?

            Thumbnails[I_Loop].setText("1");
Thumbnails[I_Loop].setTransferHandler(new TransferHandler("text"));
Thumbnails[I_Loop].addMouseListener( new MouseAdapter() {
public void mouseReleased(MouseEvent me) {
System.out.println("here mouse released");
}
public void mousePressed(MouseEvent me) {
System.out.println("here mouse pressed");
JComponent comp = (JComponent) me.getSource();
TransferHandler handler = comp.getTransferHandler();
handler.exportAsDrag(comp, me, TransferHandler.COPY);
});

*Thumbnails 是 JLabel 的数组

运行程序时,拖放有效,但不会打印“此处释放鼠标”语句。但是,当我从 mousePressed() 方法中删除负责 DND 的代码时,会打印“here mouse release”。

这段代码有什么问题?

最佳答案

@Thomas 是正确的,但有两种选择值得注意:

  • example显示如何使用 JLayeredPane 拖动组件;这个variation扩展概念;最近的example使用类似的方法。

  • 下面的代码展示了如何使用MouseMotionListener;这个更复杂example使用相同的原理。

代码:

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see https://stackoverflow.com/a/5312702/230513 */
public class MouseDragTest extends JPanel {

private static final String TITLE = "Drag me!";
private static final int W = 640;
private static final int H = 480;
private Point textPt = new Point(W / 2, H / 2);
private Point mousePt;

public MouseDragTest() {
this.setFont(new Font("Serif", Font.ITALIC + Font.BOLD, 32));
this.addMouseListener(new MouseAdapter() {

@Override
public void mousePressed(MouseEvent e) {
mousePt = e.getPoint();
repaint();
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {

@Override
public void mouseDragged(MouseEvent e) {
int dx = e.getX() - mousePt.x;
int dy = e.getY() - mousePt.y;
textPt.setLocation(textPt.x + dx, textPt.y + dy);
mousePt = e.getPoint();
repaint();
}
});
}

@Override
public Dimension getPreferredSize() {
return new Dimension(W, H);
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
int w2 = g.getFontMetrics().stringWidth(TITLE) / 2;
g.drawString(TITLE, textPt.x - w2, textPt.y);
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
JFrame f = new JFrame(TITLE);
f.add(new MouseDragTest());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
}

关于java - 用于拖放的 JLabel 鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5309150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com