- 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/
我正在用 typescript 编写一个 react 应用程序,我试图同时处理右键单击和左键单击。 这是我的界面 interface ButtonProps { value: CellValu
在 Intellij 诉 2018.3.2 中。每次将 $event 传递给方法时,我都会收到此错误。 在模板中我有: {{ header }} 然后在类里面: public toggle(event
我的棋盘游戏取得进展,因此只需单击鼠标,就会执行一些任务,例如播放一些动画、接收棋盘的新 Pane (我问了我的最后一个问题,现在效果很好)、对玩家进行更改数据等 所以,这是我的事件处理程序 grid
我正在使用 Haxe+OpenFL 制作游戏。我之前曾针对 js,然后我切换到 neko,以下构造停止工作: if(e.shiftKey) do smth Ofc 自更改目标以来,我没有更改此代码
SwingUtilities 包有一个很好的函数 convertMouseEvent,可以将一个组件上的鼠标事件转换为另一个组件上的鼠标事件: MouseEvent convertedEvent =
这看起来很简单,但我无法处理这个问题我总是在控制台中收到相同的消息: Type error: Type '(event: MouseEvent) => void' is not assignable
我发生了什么事,你能告诉我2做了什么吗? 我正在创建一个需要钩子(Hook)来替换状态的网站。我在我的index.js 上。错误发生在菜单内 div 内的 onClicks 上。菜单来自materia
我正在尝试使用 openCVsharp 方法在 c# 中获取鼠标位置并在 c# 中打开窗口。 首先我定义一个回调函数: public void mc(MouseEvent me, int x, int
我正在处理一个正在编写的程序,我需要能够检测鼠标何时离开窗口/ Canvas 。但是,据我所知,处理没有任何类似于 mouseOut 事件的内容。有什么方法可以使用回调或事件或类似性质的东西来完成此任
我正在编写一个正在处理的程序,我需要能够检测鼠标何时离开窗口/ Canvas 。然而,据我所知,processing 没有任何类似于 mouseOut 事件的东西。有什么方法可以使用回调或事件或类似性
Visual Studio Code 显示目标变量是 EventTarget输入以下 TypeScript 代码: document.addEventListener('click', (event)
如果尝试在QML定义的信号中将MouseEvent用作arg,则在加载时会出现以下错误: Invalid signal parameter type: MouseEvent Qt文档中与此有关的信息存
是否可以在Openlayer3上获得鼠标右键单击事件?如果是这样,我如何获得右键单击位置的纬度和经度。 我通过以下方式获得了右键单击事件 map.getViewport().addEventListe
我希望在 Gtk::DrawableArea 上使用 mouseevents 画一条线。我想要的是这样的: 点击线路按钮激活线路事件 选择绘图区域中的第一个点(已绘制) 现在选择绘图区域中的第二个点(
程序涉及到EventHandlers和MouseEvents的应用。该程序的目标是呈现一个空白场景,用户可以左键单击(主要)并向事件发生时鼠标所在的场景添加一个圆形对象。可以添加的圈数无关紧要。当用户
我正在尝试为单元测试创建带有某些修饰符的 MouseEvent。我使用的是 J2SE,以下代码无法通过: public void testMouseEventProblem() { Mouse
我有一个使用自己的 AS3 类构建的菜单,当单击此菜单中的链接时,它会根据从外部 XML 文件传入的一些变量触发一个函数。 菜单由四个小节组成,我希望用户能够从与该菜单完全分开的按钮跳转到该小节的父级
我有两个相交的矩形。当鼠标悬停在它们上方时,我希望两者的不透明度都发生变化。当鼠标悬停在其中一个上时它会起作用。但是当鼠标在矩形的交叉区域时,只有上面的矩形改变了它的不透明度。你能告诉我在这种情况下如
这是带有行单击的 JavaFX 表的基本示例: public class MainApp extends Application { private TableView table =
标题设法提出了大部分问题,但是,我很好奇使用 LMB 单击的哪一部分会触发视觉突出显示。 我所说的视觉突出显示是蓝色框(如果您使用默认设置),它显示您选择的文本,以便您可以看到它。据我所知,实际的选择
我是一名优秀的程序员,十分优秀!