跟踪鼠标坐标并允许在 window 中画线的程序
Program that tracks mouse coordinates and allows to draw lines in a window
程序应执行以下操作:
- 打开一个window。获取鼠标在 Window 中的位置(x 和 y 坐标)并将这些设置为 window.
的标题
- 如果您单击并按住鼠标左键,您应该可以画一条线。
问题是当我运行程序没有。 1 有效,但不是没有。 2. 调整 Window 后,坐标冻结,但我可以画线。
希望有人能帮忙。
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main extends JPanel {
private Point lastPoint;
public Main() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
lastPoint = new Point(e.getX(), e.getY());
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
Graphics g = getGraphics();
g.drawLine(lastPoint.x, lastPoint.y, e.getX(), e.getY());
lastPoint = new Point(e.getX(), e.getY());
g.dispose();
}
});
}
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setResizable(true);
frame.setVisible(true);
frame.getContentPane().add(new Main(), BorderLayout.CENTER);
frame.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
int x = e.getX();
int y = e.getY();
String xstring = String.valueOf(x);
String ystring = String.valueOf(y);
frame.setTitle(xstring + ", " + ystring);
}
});
}
}
如果将以下内容添加到 MouseMotionAdapter,您可以在拖动鼠标时看到标题是如何调整的。
也许你可以从那里继续。
public void mouseDragged(MouseEvent e) {
int x = e.getX();
int y = e.getY();
String xstring = String.valueOf(x);
String ystring = String.valueOf(y);
frame.setTitle("dragged - " + xstring + ", " + ystring);
}
稍作试验后得出以下代码:
public class Draw {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setResizable(true);
frame.setVisible(true);
JPanel myPanel = new MyPanel();
frame.getContentPane().add(myPanel, BorderLayout.CENTER);
myPanel.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
int x = e.getX();
int y = e.getY();
String xstring = String.valueOf(x);
String ystring = String.valueOf(y);
frame.setTitle(xstring + ", " + ystring);
((MyPanel) myPanel).setLastPoint(e);
}
public void mouseDragged(MouseEvent e) {
int x = e.getX();
int y = e.getY();
String xstring = String.valueOf(x);
String ystring = String.valueOf(y);
frame.setTitle("dragged - " + xstring + ", " + ystring);
Graphics g = myPanel.getGraphics();
Point lastPoint = ((MyPanel) myPanel).getLastPoint();
g.drawLine(lastPoint.x, lastPoint.y, e.getX(), e.getY());
((MyPanel) myPanel).setLastPoint(new Point(e.getX(), e.getY()));
g.dispose();
}
});
}
}
class MyPanel extends JPanel {
private Point lastPoint;
public Point getLastPoint() {
return lastPoint;
}
public void setLastPoint(Point point) {
lastPoint = point;
}
public void setLastPoint(MouseEvent e) {
lastPoint = new Point(e.getX(), e.getY());
}
}
这里有几件事:
当你想自定义Component
的绘画时,覆盖它的paintComponent
方法,不要试图用getGraphics
获取它的Graphics
对象。
使用 repaint()
重绘您的 Component
(即 paintComponent
将被调用)。
让您的 JFrame
只有在添加了所有其他组件后才可见。
以下是您的代码可以如何更改:
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main extends JPanel {
private Point lastPoint = new Point();
private Point currentPoint = new Point();
public Main() {
addMouseListener(new MouseAdapter() {
public void mousePressed(final MouseEvent e) {
lastPoint = new Point(e.getX(), e.getY());
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(final MouseEvent e) {
currentPoint = new Point(e.getX(), e.getY());
repaint();
}
});
}
@Override
public void paintComponent(final Graphics g) {
super.paintComponent(g);
g.drawLine(lastPoint.x, lastPoint.y, currentPoint.x, currentPoint.y);
}
public static void main(final String[] args) {
// TODO Auto-generated method stub
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setResizable(true);
frame.getContentPane().add(new Main(), BorderLayout.CENTER);
frame.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(final MouseEvent e) {
int x = e.getX();
int y = e.getY();
String xstring = String.valueOf(x);
String ystring = String.valueOf(y);
frame.setTitle(xstring + ", " + ystring);
}
});
frame.setVisible(true);
}
}
程序应执行以下操作:
- 打开一个window。获取鼠标在 Window 中的位置(x 和 y 坐标)并将这些设置为 window. 的标题
- 如果您单击并按住鼠标左键,您应该可以画一条线。
问题是当我运行程序没有。 1 有效,但不是没有。 2. 调整 Window 后,坐标冻结,但我可以画线。
希望有人能帮忙。
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main extends JPanel {
private Point lastPoint;
public Main() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
lastPoint = new Point(e.getX(), e.getY());
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
Graphics g = getGraphics();
g.drawLine(lastPoint.x, lastPoint.y, e.getX(), e.getY());
lastPoint = new Point(e.getX(), e.getY());
g.dispose();
}
});
}
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setResizable(true);
frame.setVisible(true);
frame.getContentPane().add(new Main(), BorderLayout.CENTER);
frame.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
int x = e.getX();
int y = e.getY();
String xstring = String.valueOf(x);
String ystring = String.valueOf(y);
frame.setTitle(xstring + ", " + ystring);
}
});
}
}
如果将以下内容添加到 MouseMotionAdapter,您可以在拖动鼠标时看到标题是如何调整的。 也许你可以从那里继续。
public void mouseDragged(MouseEvent e) {
int x = e.getX();
int y = e.getY();
String xstring = String.valueOf(x);
String ystring = String.valueOf(y);
frame.setTitle("dragged - " + xstring + ", " + ystring);
}
稍作试验后得出以下代码:
public class Draw {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setResizable(true);
frame.setVisible(true);
JPanel myPanel = new MyPanel();
frame.getContentPane().add(myPanel, BorderLayout.CENTER);
myPanel.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
int x = e.getX();
int y = e.getY();
String xstring = String.valueOf(x);
String ystring = String.valueOf(y);
frame.setTitle(xstring + ", " + ystring);
((MyPanel) myPanel).setLastPoint(e);
}
public void mouseDragged(MouseEvent e) {
int x = e.getX();
int y = e.getY();
String xstring = String.valueOf(x);
String ystring = String.valueOf(y);
frame.setTitle("dragged - " + xstring + ", " + ystring);
Graphics g = myPanel.getGraphics();
Point lastPoint = ((MyPanel) myPanel).getLastPoint();
g.drawLine(lastPoint.x, lastPoint.y, e.getX(), e.getY());
((MyPanel) myPanel).setLastPoint(new Point(e.getX(), e.getY()));
g.dispose();
}
});
}
}
class MyPanel extends JPanel {
private Point lastPoint;
public Point getLastPoint() {
return lastPoint;
}
public void setLastPoint(Point point) {
lastPoint = point;
}
public void setLastPoint(MouseEvent e) {
lastPoint = new Point(e.getX(), e.getY());
}
}
这里有几件事:
当你想自定义Component
的绘画时,覆盖它的paintComponent
方法,不要试图用getGraphics
获取它的Graphics
对象。
使用 repaint()
重绘您的 Component
(即 paintComponent
将被调用)。
让您的 JFrame
只有在添加了所有其他组件后才可见。
以下是您的代码可以如何更改:
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main extends JPanel {
private Point lastPoint = new Point();
private Point currentPoint = new Point();
public Main() {
addMouseListener(new MouseAdapter() {
public void mousePressed(final MouseEvent e) {
lastPoint = new Point(e.getX(), e.getY());
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(final MouseEvent e) {
currentPoint = new Point(e.getX(), e.getY());
repaint();
}
});
}
@Override
public void paintComponent(final Graphics g) {
super.paintComponent(g);
g.drawLine(lastPoint.x, lastPoint.y, currentPoint.x, currentPoint.y);
}
public static void main(final String[] args) {
// TODO Auto-generated method stub
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setResizable(true);
frame.getContentPane().add(new Main(), BorderLayout.CENTER);
frame.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(final MouseEvent e) {
int x = e.getX();
int y = e.getY();
String xstring = String.valueOf(x);
String ystring = String.valueOf(y);
frame.setTitle(xstring + ", " + ystring);
}
});
frame.setVisible(true);
}
}