搜罗了网友几种点击鼠标画线的代码,初学swing,表示不懂第一种和第二种为何有这么大区别。留下以后解决
一、鼠标到哪,线跟着画到哪里
//借用别人的代码
import java.awt.*;
import java.awt.event.*;public class TestMouseKey extends Frame {
int startX,startY,endX,endY;
TestMouseKey() {
final Frame f = new Frame("FRAME");
f.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
startX = e.getX();
startY = e.getY();
}
public void mouseReleased(MouseEvent e){
// Graphics g = f.getGraphics();endX = e.getX();
endY = e.getY();
// g.drawLine(startX,startY,endX,endY);
}
});
public void mouseDragged(MouseEvent e){
endX = e.getX();
endY = e.getY();
f.getGraphics().drawLine(startX,startY,endX,endY);
startX=endX;
startY=endY;
}
});
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
f.setSize(300,400);
f.setVisible(true);
}
public static void main(String args[]){
new TestMouseKey();
}
}
二、鼠标点完了才画出线
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MouseDemo extends JFrame implements MouseListener,MouseMotionListener {
int flag; //flag=1代表Mouse Moved,flag=2代表Mouse Dragged
int x = 0;
int y = 0;
int startx, starty, endx, endy;//起始坐标与终点坐标
public MouseDemo() {
Container contentPane = getContentPane();
contentPane.addMouseListener(this);
contentPane.addMouseMotionListener(this);
setSize(300, 300);
show();
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
/*由mousePressed(),mouseReleased()取得鼠标拖曳的开始与结束坐标*/
public void mousePressed(MouseEvent e) {
if(flag==3){
flag=4;
endx = e.getX();
endy = e.getY();
repaint();
}
else{
flag=1;
startx = e.getX();
starty = e.getY();
}
}
public void mouseReleased(MouseEvent e) {
if(flag==1){
flag=2;
endx = e.getX();
endy = e.getY();
repaint();
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
/*mouseMoved(),mouseDragged()取得鼠标移动的每一个坐标,并调用repaint()方法*/
public void mouseMoved(MouseEvent e) {
if(flag ==2){
flag=3;
endx = e.getX();
endy = e.getY();
repaint();
}
}
public void mouseDragged(MouseEvent e) {
// if(flag ==2){
// flag=3;
// endx = e.getX();
// endy = e.getY();
// repaint();
// }
}
public void update(Graphics g) {
g.setColor(this.getBackground());
g.fillRect(0, 0, getWidth(), getHeight()); //清除当前的窗口内容
paint(g);
}
public void paint(Graphics g) {
g.setColor(Color.black);
if (flag == 4) {
// g.drawString("鼠标坐标:(" + x + "," + y + ")", 10, 50);
g.drawLine(startx, starty, endx, endy);
}
if (flag == 9) {
// g.drawString("拖曳鼠标价坐标:(" + x + "," + y + ")", 10, 50);
g.drawLine(startx, starty, x, y);
}
}
public static void main(String[] args) {
new MouseDemo();
}
}
三、正常的一种情况,画直线-鼠标释放拖拽
import java.util.ArrayList;
import javax.swing.*;
import java.awt.*;
import java.awt.Point;
import java.awt.event.*;
public class Linepanel extends JPanel
{
private Point point1=null,point2=null;
private ArrayList<Point> pointlist;
public Linepanel()
{
pointlist=new ArrayList<Point>();
Linelistener listener=new Linelistener();
addMouseListener(listener);
addMouseMotionListener(listener);
setBackground(Color.black);
setPreferredSize(new Dimension(400,200));
}
public void paintComponent(Graphics page)
{
super.paintComponent(page);
page.setColor(Color.yellow);
if(pointlist.size()>=2)
{
for(int i=1;i<pointlist.size();i++)
{
page.drawLine(pointlist.get(i-1).x,pointlist.get(i-1).y,pointlist.get(i).x,pointlist.get(i).y);
point1=pointlist.get(i);
}
}
if(point1!=null && point2!=null)
{
page.drawLine(point1.x,point1.y,point2.x,point2.y);
}
}
private class Linelistener implements MouseListener,MouseMotionListener
{
public void mousePressed(MouseEvent event)
{
point1=event.getPoint();
pointlist.add(point1);
}
public void mouseDragged(MouseEvent event){}
public void mouseClicked(MouseEvent event){}
public void mouseReleased(MouseEvent event){}
public void mouseEntered(MouseEvent event){}
public void mouseExited(MouseEvent event){}
public void mouseMoved(MouseEvent event){
point2=event.getPoint();
repaint();
}
}
public static void main(String[] arg)
{
JFrame frame=new JFrame("Draw lines");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Linepanel pane=new Linepanel();
frame.getContentPane().add(pane);
frame.pack();
frame.setVisible(true);
}
}