绘图的问题 在panel上,鼠标按下挪动,松开画一个矩形,矩形的位置是鼠标按下和松开的位置。意思就是动态的绘制一个矩形。请各位高手指教一下 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用mouselistener,在mousePressed()中获取当前点的坐标并记录,在mouseReleased()中获取第二个坐标,然后画矩形 真正做的时候,没那么简单,需要考虑很多复杂问题,比如向右下拖曳与向左上拖曳的处理是有点不一样的。以前学Swing事件时写过一个小程序:可以画线、矩形、椭圆。可以调配各种颜色。绘制矩形或椭圆时按住Shift键,可以绘制正方形或圆。在画布上单击鼠标右键,将弹出快捷菜单,可以执行“撤消”等操作。可能对楼主有所帮助。楼主如有兴趣,可以下载来看看。呵呵。简易绘图 v1.0.1 [接2楼]这是其中的部分代码,为满足楼主的要求而做了简化,去掉了集合,只保留最后绘制的矩形:import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Exercise2 { public static void main(String[] args) { DrawFrame frame = new DrawFrame(); frame.setVisible(true); }}class DrawFrame extends JFrame { public DrawFrame() { setTitle("简易绘图 v1.0.1"); setSize(640, 480); setExtendedState(Frame.MAXIMIZED_BOTH); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentpane = getContentPane(); DrawPanel drawPanel = new DrawPanel(); setLayout(new BorderLayout()); contentpane.add(drawPanel, BorderLayout.CENTER); contentpane.add("South", new Label("提示:按住Shift键,可以绘制正方形")); }}class DrawPanel extends JPanel { Color currColor = Color.BLACK; // 绘制颜色 boolean isDraw = false; // 是否开始绘制 boolean isShift = false; int x1, y1, x2, y2; // 构造函数,初始化变量及布局组件 DrawPanel() { setBackground(Color.white); // repaint(); setBorder(BorderFactory.createLineBorder(Color.BLACK)); addMouseListener(new MouseAdapter() { // 监听鼠标事件 public void mousePressed(MouseEvent event) { // 按左键时确定起始点坐标 if (event.getButton() == event.BUTTON1) { x1 = event.getX(); y1 = event.getY(); if (!isDraw) isDraw = true; } else isDraw = false; } public void mouseReleased(MouseEvent event) { // 松开左键将绘画数据存入相应数组 if (event.getButton() == event.BUTTON1) { x2 = event.getX(); y2 = event.getY(); int left, top, width, height; width = Math.abs(x1 - x2); height = Math.abs(y1 - y2); left = Math.min(x1, x2); isShift = event.isShiftDown(); if (isShift) height = width;// 按下Shift键统一宽高 // 确定顶坐标(因为高度可能因为画正方形或圆而被改变) top = (y2 < y1) ? y1 - height : y1; repaint(); } } }); addMouseMotionListener(new MouseMotionListener() { public void mouseMoved(MouseEvent event) { // 鼠标在绘图区保持十字形状 requestFocus(); setCursor(Cursor .getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); } public void mouseDragged(MouseEvent event) { // 鼠标拖动时绘制临时图画 if (isDraw) { isShift = event.isShiftDown(); x2 = event.getX(); y2 = event.getY(); repaint(); } } }); } public void paintComponent(Graphics g) { super.paintComponent(g); // 以下计算临时图形数据并绘制 if (isDraw) { g.setColor(currColor); int left, top, width, height; width = Math.abs(x1 - x2); height = Math.abs(y1 - y2); left = Math.min(x1, x2); if (isShift) height = width;// 按下Shift键统一宽高 //确定顶坐标(因为高度可能因为画正方形或圆而被改变) top = (y2 < y1) ? y1 - height : y1; g.drawRect(left, top, width, height); } }}运行效果如下: 用java.awt.gemo.Rectangle2D类.直接根据两点构造矩形就行了.让后用Graphics2D.draw(Shape);前提是在mousePressed和mouseReleased中获取两点。 up 学习中。GUI 我学了很久了,没有学会多少!! 在鼠标事件监听中mouseReleased()和mouseDragged()、mouseMoved()不能放一起,是不是啊!高手! 鉴于鼠标事件的复杂性,Swing中提供了两个不同的接口用于负责鼠标事件的处理。MouseListener负责处理五个:按下、释放、单击、进入或离开MouseMotionListener负责处理两个:移动、拖动mouseReleased()属于MouseListenermouseDragged()、mouseMoved()属于MouseMotionListener这三个方法是分别定义在两个不同的接口中,但是也是可以放在一起的。你写一个类,同时实现这两个接口,它们就在一起啦。呵呵。形如:public class MyMouseHandler extends MouseAdapter implements MouseMotionListener //MouseAdapter是MouseListener的一个实现类{ public void mouseReleased(MouseEvent e){ } public void mouseMoved(MouseEvent e){ } public void mouseDragged(MouseEvent e){ }} JNA 调用dll时的参数问题 JTree中如何动态的添加结点 求编写bean的一个完整例子, 在weblogic下配置链接oracle数据库,以下几种方式有什么区别?谢谢 请教高手,请问在java中调用ocx或者com组件,如何收到它们的事件以及传出参数? 请问用applet做的游戏可以实现联机对战功能吗? java.class.path属性的值 大家有没有在使用tomcat中遇到如下问题,帮我看看,谢谢,该如何解决呢? 正则表达式问题(JAVASE) 一个关于java流问题 关于JAVA的一些比较总要而且很基本的问题 配置ssh环境tomcat启动不起 ??????
可以画线、矩形、椭圆。
可以调配各种颜色。
绘制矩形或椭圆时按住Shift键,可以绘制正方形或圆。
在画布上单击鼠标右键,将弹出快捷菜单,可以执行“撤消”等操作。可能对楼主有所帮助。楼主如有兴趣,可以下载来看看。呵呵。简易绘图 v1.0.1
这是其中的部分代码,为满足楼主的要求而做了简化,去掉了集合,只保留最后绘制的矩形:import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class Exercise2 {
public static void main(String[] args) {
DrawFrame frame = new DrawFrame();
frame.setVisible(true);
}
}class DrawFrame extends JFrame {
public DrawFrame() {
setTitle("简易绘图 v1.0.1");
setSize(640, 480);
setExtendedState(Frame.MAXIMIZED_BOTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentpane = getContentPane();
DrawPanel drawPanel = new DrawPanel();
setLayout(new BorderLayout());
contentpane.add(drawPanel, BorderLayout.CENTER);
contentpane.add("South", new Label("提示:按住Shift键,可以绘制正方形"));
}
}class DrawPanel extends JPanel {
Color currColor = Color.BLACK; // 绘制颜色
boolean isDraw = false; // 是否开始绘制
boolean isShift = false;
int x1, y1, x2, y2;
// 构造函数,初始化变量及布局组件
DrawPanel() {
setBackground(Color.white); // repaint();
setBorder(BorderFactory.createLineBorder(Color.BLACK)); addMouseListener(new MouseAdapter() { // 监听鼠标事件
public void mousePressed(MouseEvent event) { // 按左键时确定起始点坐标
if (event.getButton() == event.BUTTON1) {
x1 = event.getX();
y1 = event.getY();
if (!isDraw)
isDraw = true;
} else
isDraw = false;
} public void mouseReleased(MouseEvent event) { // 松开左键将绘画数据存入相应数组
if (event.getButton() == event.BUTTON1) {
x2 = event.getX();
y2 = event.getY();
int left, top, width, height;
width = Math.abs(x1 - x2);
height = Math.abs(y1 - y2);
left = Math.min(x1, x2);
isShift = event.isShiftDown();
if (isShift)
height = width;// 按下Shift键统一宽高
// 确定顶坐标(因为高度可能因为画正方形或圆而被改变)
top = (y2 < y1) ? y1 - height : y1;
repaint();
}
}
});
addMouseMotionListener(new MouseMotionListener() {
public void mouseMoved(MouseEvent event) { // 鼠标在绘图区保持十字形状
requestFocus();
setCursor(Cursor
.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
} public void mouseDragged(MouseEvent event) { // 鼠标拖动时绘制临时图画
if (isDraw) {
isShift = event.isShiftDown();
x2 = event.getX();
y2 = event.getY();
repaint();
}
}
});
} public void paintComponent(Graphics g) {
super.paintComponent(g);
// 以下计算临时图形数据并绘制
if (isDraw) {
g.setColor(currColor);
int left, top, width, height;
width = Math.abs(x1 - x2);
height = Math.abs(y1 - y2);
left = Math.min(x1, x2);
if (isShift)
height = width;// 按下Shift键统一宽高
//确定顶坐标(因为高度可能因为画正方形或圆而被改变)
top = (y2 < y1) ? y1 - height : y1;
g.drawRect(left, top, width, height);
}
}
}运行效果如下:
直接根据两点构造矩形就行了.让后用Graphics2D.draw(Shape);
前提是在mousePressed和mouseReleased中获取两点。
鉴于鼠标事件的复杂性,Swing中提供了两个不同的接口用于负责鼠标事件的处理。
MouseListener负责处理五个:按下、释放、单击、进入或离开
MouseMotionListener负责处理两个:移动、拖动mouseReleased()属于MouseListener
mouseDragged()、mouseMoved()属于MouseMotionListener
这三个方法是分别定义在两个不同的接口中,但是也是可以放在一起的。你写一个类,同时实现这两个接口,它们就在一起啦。呵呵。
形如:
public class MyMouseHandler extends MouseAdapter implements MouseMotionListener //MouseAdapter是MouseListener的一个实现类
{
public void mouseReleased(MouseEvent e){ }
public void mouseMoved(MouseEvent e){ }
public void mouseDragged(MouseEvent e){ }
}