java - 如何在另一种方法中使用 MouseMotion 整数
问题描述
所以基本上我在玩图形和一堆有趣的东西,在制作游戏之前我想知道如何使用不同的循环来做一些有趣的事情,但我不知道如何使用INT 我在mouseMoved 方法中制作,然后在Graphics 方法中使用它。该代码可能会显示一个更好的示例来说明我要解释的内容。
package com.martin;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Random;
import javax.swing.*;
public class Grids extends JFrame implements MouseMotionListener {
JPanel p = new JPanel();
public int width = 1200;
public int height = 800;
public Grids() {
addMouseMotionListener(this);
windowLoader();
}
public static void main(String[] args){
new Grids();
}
public void windowLoader() {
setPreferredSize(new Dimension(width, height));
setMaximumSize(new Dimension(width, height));
setMinimumSize(new Dimension(width, height));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
// setBackground(Color.BLACK);
p.setSize(width, height);
p.setOpaque(false);
// p.setBackground(Color.BLACK);
add(p);
pack();
setVisible(true);
}
public void mouseMoved(MouseEvent e) {
double mouseX = e.getX();
double mouseY = e.getY();
}
public void mouseDragged(MouseEvent e) {
}
public void paint(Graphics g) {
Random rand = new Random();
int cols, rows;
int size = 8;
Color color;
for (rows = 0; rows < width; rows++) {
for (cols = 0; cols < height; cols++) {
color = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));
// g.setColor(color);
// g.fillRect(rows * size, cols * size, size, size);
// g.drawRect(rows * size, cols * size, size, size);
// g.drawLine(rows * size, cols * size, size, size);
// g.drawRoundRect(rows * size, cols * size, size, size, 10, 10);
// g.fillRoundRect(rows * size, cols * size, size, size, 10, 10);
}
}
// int x = 0;
// int y = 0;
// int spacing = rand.nextInt(20) + 1;
//
// while (spacing > -1) {
// spacing = spacing + rand.nextInt(20);
// }
//
// while (x < width) {
// g.drawLine(x, 0, x, height);
// x = x + spacing;
// }
// while (y < height) {
// g.drawLine(0, y, width, y);
// y = y + spacing;
// }
// Point mouseL = MouseInfo.getPointerInfo().getLocation();
// double mouseX = mouseL.getX();
// double mouseY = mouseL.getY();
int x = 0, y = 0;
//Can't access the int from the mouseMoved I get red underline for error (variable cannot be found)
while (x < width) {
if (mouseX < 1) {
x = x + 10;
} else {
x = x + (int)mouseX;
}
while (y < height) {
if (mouseY < 1) {
y = y + 10;
} else {
y = y + (int)mouseY;
}
g.fillRoundRect(x, y, 10, 10, 10, 10);
}
}
repaint();
}
}
这是整个代码,我尝试使用 MouseInfo 来获取指针位置,但它获取 JFrame 组件的位置,我想在 JFrame 本身而不是组件之外获取鼠标位置。
解决方案
我相信以下mre演示了您想要的功能。
用于drawTrail
打开或关闭轨迹绘制:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Grids extends JPanel implements MouseMotionListener {
public final static int WIDTH = 1200, HEIGHT = 800, POINT_SIZE = 10;
private double mouseX, mouseY;
private List<Point> points ; //stores all trail points
private boolean drawTrail = true; //change to false to draw only one point at the mouse location
public Grids() {
addMouseMotionListener(this);
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setBackground(Color.WHITE);
if(drawTrail) {
points = new ArrayList<>(); //add mouse point to collection
}
}
@Override
public void mouseMoved(MouseEvent e) {
//set a min distance between points
if( Math.abs(mouseX - e.getX()) >= POINT_SIZE || Math.abs(mouseY - e.getY()) >= POINT_SIZE ) {
if(drawTrail) {
points.add(new Point(e.getX(),e.getY()));
}
mouseX = e.getX();
mouseY = e.getY();
repaint();
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Random rand = new Random();
if(drawTrail){
//draw all collected points
for (Point p : points){
Color color = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));
g.setColor(color);
g.fillOval(p.x, p.y, POINT_SIZE, POINT_SIZE);
}
}else{
//if you only want the point at the
Color color = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));
g.setColor(color);
g.fillOval((int)mouseX, (int)mouseY, POINT_SIZE, POINT_SIZE);
}
}
@Override
public void mouseDragged(MouseEvent e) {/*todo*/}
public static void main(String[] args0) {
JFrame frame = new JFrame();
frame.add(new Grids());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}
}
推荐阅读
- angular - 角度 - 如何使用 setcustomvalidity 函数
- css - 无法在 Angular 6 中覆盖 Slick 轮播样式?
- c# - 后台工作人员更新 Gridview
- swift - 如何在 Xcode 10 中创建 MLImageClassifier
- exchange-server - 刺激收件人登录邮件交换服务器?
- react-native - 带有Tracker的react-native-meteor不必要地每秒重复订阅
- python - 难以通过串行数据将数字从 Arduino 发送到 Python
- excel - VBA - 如何在“文件名”中参考其他打开的工作簿的“单元格值”来“另存为”
- visual-studio - 使用远程 docker 主机调试 Visual Studio 容器
- python - 如何在多个条件下使用 np.arwhere?