- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了一个无用的程序,它给你的鼠标指针添加了一条红色的轨迹。但是,如果鼠标移动得太快,轨迹就会扭曲。我认为我的问题出在我的 paintComponent(Graphics g)
方法或 mouseMoved(MouseEvent e)
方法中。有什么想法可以让 Swing 绘制出更平滑的路径吗?
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;
public class TrailTest {
//needs SwingUtilities.invokeLater but this a test class
public static void main(String[] args) {
JFrame f = new JFrame();
TrailPanel p = new TrailPanel();
p.setOpaque(false);
p.addMouseMotionListener(new MouseInputAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
//can't add enough points? or my rendering policy is bad?
p.put(e.getPoint());
p.repaint();
}
});
f.add(p);
f.setSize(500, 500);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
private static class TrailPanel extends JPanel {
private static final long serialVersionUID = 214019134136464119L;
private ConcurrentHashMap<Point, Integer> m;
public TrailPanel() {
m = new ConcurrentHashMap<>();
Thread t = new Thread(() -> {
while (true) {
m.replaceAll((k, v) -> v - 10);
m.entrySet().removeIf(entry -> entry.getValue() < 0);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();
}
});
t.start();
}
public void put(Point p) {
m.put(p, 1020);
}
//problem is with the rendering policy????? idk, help :(
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(new BasicStroke(3));
for (Entry<Point, Integer> entry : m.entrySet()) {
Point p = entry.getKey();
try {
g2d.setColor(new Color(255, 0, 0, entry.getValue() / 4));
} catch (IllegalArgumentException ex) {}
g2d.drawArc((int) p.getX(), (int) p.getY(), 1, 1, 0, 360);
}
}
}
}
最佳答案
多亏了安德鲁·汤普森的想法,我的工作速度非常快。我创建了另一个 HashMap
,它将一个 Point
映射到另一个 Point
。然后在我的 paintComponent(Graphics g)
方法中,我在它们之间画了一条线。这样,点之间的空间就消失了。
注意:该解决方案使用 LinkedHashMap
,因为 LinkedHashMap
在执行操作时保留插入顺序。
工作代码:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;
public class TrailTest {
public static void main(String[] args) {
JFrame f = new JFrame();
TrailPanel p = new TrailPanel();
p.setOpaque(false);
p.addMouseMotionListener(new MouseInputAdapter() {
// must remember to connect the current with the last one
private Point lastPoint = null;
@Override
public void mouseMoved(MouseEvent e) {
final Point mouseLocation = e.getPoint();
if (lastPoint != null) {
p.put(mouseLocation);
p.connect(mouseLocation, lastPoint);
}
lastPoint = mouseLocation;
p.repaint();
}
});
f.add(p);
f.setSize(500, 500);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
private static class TrailPanel extends JPanel {
private static final long serialVersionUID = 214019134136464119L;
private ConcurrentHashMap<Point, Integer> points;
private LinkedHashMap<Point, Point> lines;
public TrailPanel() {
points = new ConcurrentHashMap<>();
lines = new LinkedHashMap<>();
Thread t = new Thread(() -> {
while (true) {
points.replaceAll((k, v) -> v - 10);
points.entrySet().removeIf(entry -> entry.getValue() < 0);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();
}
});
t.start();
}
public void connect(Point p1, Point p2) {
lines.put(p1, p2);
}
public void put(Point p) {
points.put(p, 1020);
}
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(new BasicStroke(3));
for (Entry<Point, Integer> entry : points.entrySet()) {
Point p = entry.getKey();
try {
g2d.setColor(new Color(255, 0, 0, entry.getValue() / 4));
} catch (IllegalArgumentException ex) {}
//might want to comment drawArc if you want to make it look better by a liiiiitle.
g2d.drawArc((int) p.getX(), (int) p.getY(), 1, 1, 0, 360);
g2d.drawLine((int) p.getX(), (int) p.getY(), (int) lines.get(p).getX(), (int) lines.get(p).getY());
}
}
}
}
关于java - mouseMoved(MouseEvent e) 跟不上程序逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51111689/
如果我有一个密集的 mousemove 处理程序 window.moveEventCounter = 0; window.addEventHandler("mousemove", function(e
我创建了一个 jquery 小部件,它允许我将其附加到 Canvas 并记录用户创建的绘图。 我在使用 Firefox 时遇到问题,jQuery 触发的事件不起作用;但 native JavaScri
$("#father").mousemove(function(){ alert("out"); }) 如何只在父级上绑定(bind) mousemove 事件,而不继承子
我遇到了一些奇怪的事情,但我不确定它是否是故意的或者是什么原因造成的。 我正在试验一些 JavaScript,当用户在屏幕上移动鼠标时循环一组图像。我正在使用 jQuery mousemove为了这。
我想是新手问题。 以下代码是我在文档就绪时调用的函数的一部分。它旨在在鼠标移动时永久返回当前鼠标位置的值。 正在发生的奇怪事情:在文档就绪时移动鼠标不会将任何内容记录到控制台。我知道 mouse_mo
我创建了一个 WPF 应用程序,其中关闭了标题栏和镶边。我在整个应用程序周围有一个边框,认为它在某些方面会像 chrome 一样。我尝试做的第一件事是让 mousemove 事件在单击鼠标时捕获鼠标的
想知道是否有适用于移动设备的 mousemove 的等效项,例如 touchmove 或 touchdrag 等。 我在容器中有一个图像,可以使用鼠标移动在悬停时平移该图像。有没有办法也可以针对移动设
如何在 JQuery 中创建鼠标按下并移动时触发的事件?并且每次 mousedown + mousemove 只触发一次? 最佳答案 更新: 因此,看起来如果您的鼠标不再位于绑定(bind) onmo
我已经实现了一个自定义 NSView(标记为 )并且能够获取 mouseUp:、mouseDown: 和 mouseMoved: 事件。对此,我已 AcceptFirstResponder 返回 YE
我通过以下方式使用事件监听器/处理程序: var _builder_canvas = document.getElementById("Builder"); mouseMove = f
我有一个子类NSView这是子类 NSDocument 的 .xib 文件的一部分,它通过 NSDocumentController 的默认行为变得活跃。的openDocument:方法。在此子类中
正如标题所说,我注意到在我的 Canvas 上,当按下/释放鼠标按钮时,即使我实际上没有移动鼠标,也会触发 mousemove 。问题是,在释放按钮的情况下,它会在 mouseup 之后被触发! 这是
u如何记录鼠标坐标的值? div = document.querySelector('.div'); div.addEventListener('mousemove', function yo(u)
Private Sub framePDF_MouseMove(ByVal... ) framePDF.BackColor = &H80000012& 所以,框架的颜色正在改变。 当光标远离框架时,我
我正在尝试制作一个特定的 仅当我的鼠标位于 范围内时,元素才保持可见元素并在 内移动元素。如果鼠标在 之外元素或在 内静止元素,那么它应该隐藏 元素。 我正在使用 mousemove事件监听器
我试图获取一个 mousemove 函数来显示当鼠标移动到特定 div 内时我创建的自定义光标元素。自定义光标是我希望它出现在的 div 中的绝对定位 div。我看到的奇怪的事情是我可以从开发人员工具
尝试用头顶摄像头制作一个简单的角色扮演游戏。当我去实现一个 MouseMotionListener 时(这不是我第一次使用 MouseMotionListener),似乎 mousedMoved Mo
我一直在尝试使用这段代码,就像当您将鼠标悬停在开始按钮上时,它应该将其颜色更改为灰色,但每当我将鼠标悬停在它上面时。什么也没发生,有人能告诉我为什么吗?我没有收到任何错误,编译器似乎无法识别我的鼠标移
我正在尝试从外部小程序获取鼠标移动事件,如下所示: Applet loader = (Applet) new URLClassLoader( new URL[] { new F
我正在用java创建一个游戏。在其中,您控制一个跟随鼠标的方 block 。我想对正方形实现碰撞检测,以便它在 JFrame 内稍微停止,而不是在边缘处。使用箭头键执行此操作非常容易,但我无法使用 m
我是一名优秀的程序员,十分优秀!