java绘图的一个小问题

开不了口1990 2012-09-08 10:44:33
想用鼠标画个点,可以坐标总是不对,不知道要怎么改。

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class DrawTest extends JFrame {
MyPanel mp = null;

public static void main(String[] args) {
new DrawTest();
}

public DrawTest() {
mp = new MyPanel();
this.addMouseListener(mp);
this.add(mp);
this.setSize(600, 400);
this.setLocation(400, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}

class MyPanel extends JPanel implements MouseListener {
int x = 0, y = 0;
Image img = null;

public void paint(Graphics g) {
super.paint(g);
g.fillOval(x, y, 10, 10);
}

public void mouseClicked(MouseEvent e) {
x = e.getX();
y = e.getY();
this.repaint();
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

}
...全文
181 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
开不了口1990 2012-09-08
  • 打赏
  • 举报
回复
谢谢了![Quote=引用 2 楼 的回复:]
Java code
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class DrawTest extends JFrame {
MyPanel mp = null;

public st……
[/Quote]
Inhibitory 2012-09-08
  • 打赏
  • 举报
回复
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class DrawTest extends JFrame {
MyPanel mp = null;

public static void main(String[] args) {
new DrawTest();
}

public DrawTest() {
mp = new MyPanel();

// 鼠标事件是加在frame上,而不是在mp上的,
// 所以在mp中取得坐标时,坐标不是相对于mp的,而是相对于frame的
// 而frame还有一个标题栏,这个是有高度的
// 最终使用屏幕坐标转换成组件坐标可以解决这一问题
this.addMouseListener(mp);

this.add(mp);
this.setSize(600, 400);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}

class MyPanel extends JPanel implements MouseListener {
int x = 0, y = 0;
Image img = null;

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillOval(x, y, 10, 10);
}

public void mouseClicked(MouseEvent e) {
Point p = e.getLocationOnScreen();
SwingUtilities.convertPointFromScreen(p, this); // 关键在于把屏幕坐标映射成组件坐标
x = p.x;
y = p.y;
this.repaint();
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

}
liuwons 2012-09-08
  • 打赏
  • 举报
回复
我能想到的原因:点击事件获取的鼠标xy坐标是相对于程序界面左上角的,而画图的fillOval的xy是相对于工作区左上角的,所以会相差一个边框的高度和宽度

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧