- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个组件,每个组件都有自己的 MouseMotionListener。当我在拖动第一个组件的同时将鼠标从第一个组件移动到第二个组件时,第二个组件的 MouseMotionListener 似乎被禁用,即,尽管我将鼠标移到第二个组件上,但根本没有调用 mouseMoved。如何避免这种“禁用”?
示例:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class DragTest implements MouseMotionListener {
private static JPanel p1 = new JPanel();
private static JPanel p2 = new JPanel();
public DragTest() {
}
public static void main(String[] args) {
p1.setBackground(Color.RED);
p1.addMouseMotionListener(new DragTest());
p2.setBackground(Color.BLUE);
p2.addMouseMotionListener(new DragTest());
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(100, 100, 600, 300);
frame.setLayout(new GridLayout(1, 2));
frame.add(p1);
frame.add(p2);
frame.setVisible(true);
}
@Override
public void mouseMoved(MouseEvent e) {
if (e.getSource() == p1) {
System.out.println("mouse movement in p1");
} else if (e.getSource() == p2) {
System.out.println("mouse movement in p2");
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (e.getSource() == p1) {
System.out.println("mouse drag in p1");
} else if (e.getSource() == p2) {
System.out.println("mouse drag in p2");
}
}
}
最佳答案
免责声明:这是核心拖放 API 的一个非常非常基本的示例,基于 this example和 this example和 this example旨在简单地演示确定指定掉落位置的可能性
因此,当涉及到拖动内容时,尤其是跨组件拖动时,通常最好使用拖放 API,而不是简单地使用 MouseMotionListener
和 MouseListener
。这就是 API 的设计目的,并向两个目标提供有关操作性质的通知
下面的示例只是存储您放下东西的位置并在那里画一个漂亮的小点
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
import javax.swing.border.MatteBorder;
public class DragAndDropTest {
public static void main(String[] args) {
new DragAndDropTest();
}
public DragAndDropTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridLayout(1, 2));
add(new DropPane());
add(new DragPane());
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.dispose();
}
}
public class DragPane extends JPanel {
private DragSource ds;
private Transferable transferable;
public DragPane() {
ds = new DragSource();
transferable = new Transferable() {
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{DataFlavor.stringFlavor};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return DataFlavor.stringFlavor.equals(flavor);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
return "This is a test";
}
};
ds.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY_OR_MOVE, new DragGestureListener() {
@Override
public void dragGestureRecognized(DragGestureEvent dge) {
// This is where you would export the data you want
// to transfer
ds.startDrag(dge, DragSource.DefaultCopyDrop, transferable, new DragSourceListener() {
@Override
public void dragEnter(DragSourceDragEvent dsde) {
}
@Override
public void dragOver(DragSourceDragEvent dsde) {
}
@Override
public void dropActionChanged(DragSourceDragEvent dsde) {
}
@Override
public void dragExit(DragSourceEvent dse) {
}
@Override
public void dragDropEnd(DragSourceDropEvent dsde) {
}
});
}
});
setLayout(new GridBagLayout());
add(new JLabel("Drag from here"));
setBorder(new LineBorder(Color.RED));
}
}
public class DropPane extends JPanel {
private List<Point> dropPoints;
public DropPane() {
dropPoints = new ArrayList<>(25);
setDropTarget(new DropTarget(this, new DropTargetListener() {
@Override
public void dragEnter(DropTargetDragEvent dtde) {
}
@Override
public void dragOver(DropTargetDragEvent dtde) {
}
@Override
public void dropActionChanged(DropTargetDragEvent dtde) {
}
@Override
public void dragExit(DropTargetEvent dte) {
}
@Override
public void drop(DropTargetDropEvent dtde) {
// Normally here, I'd inspect the Transferable and make sure
// what is been dropped and can be imported, I'd then go through
// the process of unwrapping the data from the Transferable and
// processing it appropriatly, but in this example, I really don't
// care, I just care about WHERE the event occured
dropPoints.add(dtde.getLocation());
dtde.dropComplete(true);
repaint();
}
}));
setLayout(new GridBagLayout());
add(new JLabel("Drop to here"));
setBorder(new MatteBorder(1, 1, 1, 0, Color.RED));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
for (Point p : dropPoints) {
g.fillOval(p.x - 2, p.y - 2, 5, 5);
}
}
}
}
关于java - 拖动会禁用其他 MouseMotionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33203348/
我正在用 Java 开发黑白棋游戏,我正在做的一件事是让空格的背景颜色在移动有效时变为绿色。我想通过当玩家将鼠标放在空间上时让它变成绿色来做到这一点,但我无法弄清楚当鼠标从空间中移开时如何使颜色恢复默
正在开发一个绘制两只眼睛的小程序,并使用 MouseMotionListener 来移动它们的眼睛。此外,当鼠标退出内容 Pane 时,眼睛会直视。有一件事我正在努力解决的是我不知道如何限制瞳孔的运动
我是 Java 新手,现在我正在尝试了解线程。 我目前正在开发一款“让球弹起来,否则你就输”的游戏。 在这个游戏中,有一个球会从“墙”或“梁”上弹起。 墙随着光标的 x 位置移动。没有 y 轴运动。
我有两个组件,每个组件都有自己的 MouseMotionListener。当我在拖动第一个组件的同时将鼠标从第一个组件移动到第二个组件时,第二个组件的 MouseMotionListener 似乎被禁
下面的类(class)演示了我在 FSEM 中使用 MouseMotionListeners 时遇到的问题。 public class TestGUI extends JFrame { Panel p
我有一个 MouseMotionListener,在 mouseDragged 方法中我有一个变为 true 的 boolean 值。问题是我不知道如何让它在拖动结束后变回 false。有没有办法做到
我正在尝试创建一个图形绘制程序,允许用户通过将鼠标拖动到屏幕上来在屏幕上绘制红色像素。因此,在某种程度上,您可以将此程序视为 Microsoft 的画图程序,但只有铅笔绘图工具和红色。 不幸的是,我的
我不久前才开始编码。我现在正在尝试使用 JPanel 制作 FruitNinja 类型的游戏,并且我几乎完成了所有操作(除了使游戏继续进行的循环以及其余的水果)/炸弹动画) 到目前为止,我只对 App
我有一个测试,你必须记住 9 个小程序并编写它们。问题是,我有学习障碍,事情对我来说常常变得非常“模糊”,我无法正确记住事情 - 特别是大事情。 测试的具体内容是“以尽可能小的方式编写这些程序”。 所
构造函数内部: addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e){
我收到错误: AniWorld is not abstract and does not override abstract method mouseMoved(MouseEvent) in Mous
我实现了MouseMotionListener,也实现了MouseListener。我在构造函数 newContentPane.addMouseListener(this) 和 中添加 newCont
我正在尝试将 MouseMotion 事件添加到标签,并根据鼠标的拖动来移动它,并使其随鼠标一起移动。但是,鼠标 Action 很难控制,因此无法使用此操作。这是代码 import java.awt.
我在我的 JFrame 中添加了一个 MouseMotionListener 来控制从我的 jframe 中的所有对象到达的所有鼠标运动消息,但是当我将鼠标移到 JLayeredPane 上时,没有产
我的样板监听器: class MyMouseMotionListener implements MouseMotionListener { public void mouseDragged(Mouse
我开始了一个学校项目,试图在更大的 JPanel 上绘制 9*9 和 17*17 像素的 JPanel,例如模仿 Gimp 中的钢笔。我尝试使用 MouseClicked 来启动、使用 MouseDr
好的,所以我正在制作一个完全正常的应用程序,并且遇到了 MouseMotion 和 MouseMotionListener 的问题:它们在我的 Canvas 中根本没有被调用。我以为这是我将 Canv
我正在使用一个父draw2d图形,其中包含几个子图形(按钮。使用工具栏布局),这些子图形注册到MouseMotionListener并在鼠标进入时执行一些操作(假设'enterAction')在鼠标退
我正在尝试实现 MouseOver 效果,就像在 Java 中的 JavaScript 中为 JButton 所熟知的那样。我添加了一个 MouseMotionListener 并且它起作用了。如果我
我向 JTextField 添加了一个 MouseMotionListener。但是当我使用 jf.getMouseMotionListeners().length 来了解注册了多少鼠标监听器时,我得
我是一名优秀的程序员,十分优秀!