Java:鼠标标记并在图形界面中移动
这里是新手程序员 我正在制作一个程序,在笛卡尔坐标系中呈现用户输入的方程。目前,我在让用户在坐标中自由移动视图方面遇到了一些问题。当前,使用鼠标标记,用户可以将视图拖动一点,但一旦用户释放鼠标并尝试再次移动视图,原点将捕捉回鼠标光标的当前位置。让用户自由移动的最佳方式是什么?提前谢谢 这是绘图区域的代码Java:鼠标标记并在图形界面中移动,java,swing,drag-and-drop,awt,paintcomponent,Java,Swing,Drag And Drop,Awt,Paintcomponent,这里是新手程序员 我正在制作一个程序,在笛卡尔坐标系中呈现用户输入的方程。目前,我在让用户在坐标中自由移动视图方面遇到了一些问题。当前,使用鼠标标记,用户可以将视图拖动一点,但一旦用户释放鼠标并尝试再次移动视图,原点将捕捉回鼠标光标的当前位置。让用户自由移动的最佳方式是什么?提前谢谢 这是绘图区域的代码 import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Poin
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import javax.swing.JPanel;
public class DrawingArea extends JPanel implements MouseMotionListener {
private final int x_panel = 350; // width of the panel
private final int y_panel = 400; // height of the panel
private int div_x; // width of one square
private int div_y; // height of one square
private int real_y;
private int real_x;
private Point origin; // the origin of the coordinate
private Point temp; // temporary point
private static int y = 0;
private static int x = 0;
DrawingArea() {
setBackground(Color.WHITE);
real_x = x_panel;
real_y = y_panel;
setDivisionDefault();
setOrigin(new Point((real_x / 2), (real_y / 2)));
setSize(x_panel, y_panel);
addMouseMotionListener(this);
}
DrawingArea(Point origin, Point destination) {
this.origin = origin;
this.destination = destination;
panel = new JPanel();
panel.setSize(destination.x, destination.y);
panel.setLocation(origin);
this.panel.setBackground(Color.red);
panel.setLayout(null);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D line = (Graphics2D) g;
temp = new Point(origin.x, origin.y);
line.setColor(Color.red);
drawHelpLines(line);
line.setColor(Color.blue);
drawOrigin(line);
line.setColor(Color.green);
for (int i = 0; i < 100; i++) { // This is a test line
//temp = this.suora();
temp.x++;
temp.y++;
line.drawLine(temp.x, temp.y, temp.x, temp.y);
}
}
public void setOrigin(Point p) {
origin = p;
}
public void drawOrigin(Graphics2D line) {
line.drawLine(origin.x, 0, origin.x, y_panel);
line.drawLine(0, origin.y, x_panel, origin.y);
}
public void drawHelpLines(Graphics2D line) {
int xhelp= origin.x;
int yhelp= origin.y;
for (int i = 0; i < 20; i++) {
xhelp+= div_x;
line.drawLine(xhelp, 0, xhelp, y_panel);
}
xhelp= origin.x;
for (int i = 0; i < 20; i++) {
xhelp-= div_x;
line.drawLine(xhelp, 0, xhelp, y_panel);
}
for (int i = 0; i < 20; i++) {
yhelp-= div_y;
line.drawLine(0, yhelp,x_panel, yhelp);
}
yhelp= origin.y;
for (int i = 0; i < 20; i++) {
yhelp+= div_y;
line.drawLine(0, yhelp, x_panel, yhelp);
}
}
public void setDivisionDefault() {
div_x = 20;
div_y = 20;
}
@Override
public void mouseDragged(MouseEvent e) {
//Point temp_point = new Point(mouse_x,mouse_y);
Point coords = new Point(e.getX(), e.getY());
setOrigin(coords);
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
}
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Point;
导入java.awt.Rectangle;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.event.MouseMotionListener;
导入java.awt.geom.Line2D;
导入java.awt.geom.Point2D;
导入javax.swing.JPanel;
公共类DrawingArea扩展JPanel实现MouseMotionListener{
private final int x_panel=350;//面板的宽度
私有最终int y_面板=400;//面板高度
private int div_x;//一个正方形的宽度
private int div_y;//一个正方形的高度
私人内部实体;
私有整数实x;
专用点原点;//坐标的原点
私有点临时;//临时点
私有静态int y=0;
私有静态int x=0;
绘图区域(){
挫折地面(颜色:白色);
实x=x_面板;
实y=y面板;
setDivisionDefault();
设定原点(新点((实x/2),(实y/2));
设置尺寸(x_面板、y_面板);
addMouseMotionListener(此);
}
绘图区域(点原点、点终点){
this.origin=origin;
this.destination=目的地;
panel=新的JPanel();
面板设置尺寸(目的地x、目的地y);
面板设置位置(原点);
此.面板.立根背景(颜色.红色);
panel.setLayout(空);
}
@凌驾
公共组件(图形g){
超级组件(g);
图形2d线=(图形2d)g;
温度=新点(原点x、原点y);
line.setColor(Color.red);
求助热线;
line.setColor(Color.blue);
牵引原点(直线);
line.setColor(Color.green);
对于(inti=0;i<100;i++){//这是一条测试线
//temp=this.suora();
温度x++;
温度y++;
拉线(温度x、温度y、温度x、温度y);
}
}
公共无效设置原点(点p){
原点=p;
}
公共空白图纸原点(图形2D线){
绘制线(origin.x,0,origin.x,y_面板);
绘制线(0,原点.y,x_面板,原点.y);
}
公共帮助热线(Graphics2D线){
int xhelp=origin.x;
int yhelp=原点y;
对于(int i=0;i<20;i++){
xhelp+=div_x;
拉线(xhelp,0,xhelp,y_面板);
}
xhelp=origin.x;
对于(int i=0;i<20;i++){
xhelp-=div_x;
拉线(xhelp,0,xhelp,y_面板);
}
对于(int i=0;i<20;i++){
yhelp-=部门y;
拉线(0,yhelp,x_面板,yhelp);
}
yhelp=origin.y;
对于(int i=0;i<20;i++){
y帮助+=部门y;
拉线(0,yhelp,x_面板,yhelp);
}
}
公共void setDivisionDefault(){
div_x=20;
div_y=20;
}
@凌驾
公共无效鼠标标记(鼠标事件e){
//点温度点=新点(鼠标x,鼠标y);
点坐标=新点(e.getX(),e.getY());
setOrigin(坐标系);
重新油漆();
}
@凌驾
public void mouseMoved(MouseEvent e){
}
}
基于此,以下程序允许用户将轴的交点拖动到任意点,原点
,该点从面板中心开始
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.EventQueue;
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;
/**
* @see https://stackoverflow.com/a/15576413/230513
* @see https://stackoverflow.com/a/5312702/230513
*/
public class MouseDragTest extends JPanel {
private static final String TITLE = "Drag me!";
private static final int W = 640;
private static final int H = 480;
private Point origin = new Point(W / 2, H / 2);
private Point mousePt;
public MouseDragTest() {
this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
mousePt = e.getPoint();
repaint();
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
int dx = e.getX() - mousePt.x;
int dy = e.getY() - mousePt.y;
origin.setLocation(origin.x + dx, origin.y + dy);
mousePt = e.getPoint();
repaint();
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(W, H);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(0, origin.y, getWidth(), origin.y);
g.drawLine(origin.x, 0, origin.x, getHeight());
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame(TITLE);
f.add(new MouseDragTest());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
}
你需要在某个地方结束你的评论。对不起,那是我的错误。这是实际代码的简略版本,我必须将一些变量和注释翻译成英语。您还需要发布完整的代码:有一堆未声明的变量。请发表一篇好的,希望现在可以了。@GuillaumePoulet你应该放松,他的问题对我帮助很大