Java 使用鼠标标记绘制圆的轨迹
我正试图编写一个程序,用mouseDragged绘制一条圆圈,就像MS paint那样。我已经成功地让我的程序在我点击时画了一个圆。我还成功地让我的程序在拖动鼠标时画了一个圆;然而,这并没有在我拖动的任何地方留下一行圆圈。它只是简单地把同一个圆圈拖来拖去。我试图让我的程序在我拖动的地方留下一条圆圈的轨迹,但我很困惑为什么我的程序不会这样做Java 使用鼠标标记绘制圆的轨迹,java,swing,jcomponent,Java,Swing,Jcomponent,我正试图编写一个程序,用mouseDragged绘制一条圆圈,就像MS paint那样。我已经成功地让我的程序在我点击时画了一个圆。我还成功地让我的程序在拖动鼠标时画了一个圆;然而,这并没有在我拖动的任何地方留下一行圆圈。它只是简单地把同一个圆圈拖来拖去。我试图让我的程序在我拖动的地方留下一条圆圈的轨迹,但我很困惑为什么我的程序不会这样做 package assignment_11; import java.awt.*; import java.awt.event.MouseEvent; im
package assignment_11;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.*;
public class Canvas extends JComponent implements MouseListener, MouseMotionListener{
private int x, x1;
private int y, y1;
public Canvas() {
addMouseMotionListener(this);
addMouseListener(this);
}
public static void main(String[] args) {
//creates new JFrame, sets Exit On Close, sets visible
JFrame window = new JFrame();
window.add(new Canvas());
window.pack();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
public Dimension getPreferredSize() {
return new Dimension(640,480);
}
@Override
public void mouseClicked(MouseEvent arg0) {
System.out.println(arg0);
x = arg0.getX();
y = arg0.getY();
repaint();
}
@Override
public void mouseEntered(MouseEvent arg0) {
System.out.println(arg0);
}
@Override
public void mouseExited(MouseEvent arg0) {
System.out.println(arg0);
}
@Override
public void mousePressed(MouseEvent arg0) {
System.out.println(arg0);
}
@Override
public void mouseReleased(MouseEvent arg0) {
System.out.println(arg0);
}
public void paintComponent(Graphics g) {
g.fillOval(x, y, 10, 10);
g.fillOval(x1, y1, 10, 10);
}
@Override
public void mouseDragged(MouseEvent arg0) {
System.out.println(arg0);
x1 = arg0.getX();
y1 = arg0.getY();
repaint();
}
@Override
public void mouseMoved(MouseEvent arg0) {
System.out.println(arg0);
}
}
感谢您的帮助 绘画是破坏性的。也就是说,每次调用
paintComponent
,都需要重新绘制组件的整个状态
这就产生了一个问题-每次调用paintComponent
时,您都需要某种方法来存储要绘制的状态
为此,一个简单的ArrayList
将很好地完成这项工作。它允许您存储所有感兴趣的点,并允许您在每次调用paintComponent
时重新绘制它们,例如
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class Canvas extends JComponent implements MouseListener, MouseMotionListener {
private List<Point> points;
public Canvas() {
points = new ArrayList<>(25);
addMouseMotionListener(this);
addMouseListener(this);
}
public static void main(String[] args) {
EventQueue.invokeLater((new Runnable() {
@Override
public void run() {
JFrame window = new JFrame();
window.add(new Canvas());
window.pack();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
}));
}
public Dimension getPreferredSize() {
return new Dimension(640, 480);
}
@Override
public void mouseClicked(MouseEvent arg0) {
System.out.println(arg0);
points.add(arg0.getPoint());
repaint();
}
@Override
public void mouseEntered(MouseEvent arg0) {
System.out.println(arg0);
}
@Override
public void mouseExited(MouseEvent arg0) {
System.out.println(arg0);
}
@Override
public void mousePressed(MouseEvent arg0) {
System.out.println(arg0);
}
@Override
public void mouseReleased(MouseEvent arg0) {
System.out.println(arg0);
}
public void paintComponent(Graphics g) {
for (Point p : points) {
g.fillOval(p.x, p.y, 10, 10);
}
}
@Override
public void mouseDragged(MouseEvent arg0) {
System.out.println(arg0);
points.add(arg0.getPoint());
repaint();
}
@Override
public void mouseMoved(MouseEvent arg0) {
System.out.println(arg0);
}
}
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Point;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.event.MouseMotionListener;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
公共类Canvas扩展JComponent实现MouseListener、MouseMotionListener{
私人名单点;
公共画布(){
点=新阵列列表(25);
addMouseMotionListener(此);
addMouseListener(这个);
}
公共静态void main(字符串[]args){
invokeLater((new Runnable()){
@凌驾
公开募捐{
JFrame窗口=新JFrame();
添加(新画布());
window.pack();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
}));
}
公共维度getPreferredSize(){
返回新维度(640480);
}
@凌驾
公共无效鼠标单击(鼠标事件arg0){
系统输出打印项次(arg0);
add(arg0.getPoint());
重新油漆();
}
@凌驾
公共无效鼠标事件(鼠标事件arg0){
系统输出打印项次(arg0);
}
@凌驾
public void mouseexitted(MouseEvent arg0){
系统输出打印项次(arg0);
}
@凌驾
public void mousePressed(MouseEvent arg0){
系统输出打印项次(arg0);
}
@凌驾
公共无效MouseEvent arg0{
系统输出打印项次(arg0);
}
公共组件(图形g){
对于(点p:点){
g、 椭圆形(p.x,p.y,10,10);
}
}
@凌驾
公共无效鼠标标记(鼠标事件arg0){
系统输出打印项次(arg0);
add(arg0.getPoint());
重新油漆();
}
@凌驾
public void mouseMoved(MouseEvent arg0){
系统输出打印项次(arg0);
}
}
现在,随着问题的复杂性增加,您可以将“形状”存储在列表中
中,该列表具有某种关于如何绘制自身的概念,允许添加更复杂的形状
为了更好地理解Swing中的绘画实际上是如何工作的,您还应该看一看,但是,对于OP,我不会将该类称为画布。有一个AWT类具有该名称,因此它会变得混乱。类名应该更具描述性。@camickr No argument
“我也读过许多所谓的“重复”问题,鉴于此,我仍然需要代码方面的帮助,因为我以不同的方式处理问题(尽管这可能不是解决问题的最佳方式)。”
--这并不是说你的方式“不是最佳方式”,这是错误的方式。遵循下面程序员给你的建议,你就不会出错。我不得不承认,当你被问到这个问题时,我感到惊讶和沮丧,甚至没有对mad的回答留下任何让你困惑的评论,就好像你没有阅读或关心它一样。我只是用我在课程中学到的工具来解决这个问题。本课程未涉及ArrayList,因此我相信有一种方法可以以不同于此处提供的解决方案的方式解决此问题。我没有时间自学ArrayList,这对我来说是一个全新的话题,我不想简单地复制他的代码。此外,我不是在“重新问问题”,我是在问一个不同的问题,是这个问题的延伸。我没有回答,因为我自己解决了这个问题所涉及的问题,没有使用MP的技巧。不管怎样——不要忽略给出的答案,然后问一个新问题。你对Mad的回答没有任何评论,没有,但是你被问到了这个问题,在他和我们所有人看来,当你被问到这个问题时,你完全忽视了他为回答你所付出的所有努力。同样,这会降低任何人回答你未来可能提出的任何问题的积极性,因为没有人希望他们的志愿者努力被完全忽视。至少投票并接受他的回答。