我这个画板程序有好多问题,我要画连续的直线,也就是鼠标点一下,就从上一个点到刚才点击的地方的两点之间画一条直线,但是却总是从同一个点引直线,请问是什么问题,还有就是,当我窗口最大化,最小化时,怎么图像没有了?如何解决!?import javax.swing.*;
import java.awt.*;
import java.awt.Component.*;
import java.awt.event.*;
import java.awt.image.*;public class dr extends JFrame implements ActionListener{
JButton close;
JButton line;
JButton zline;
JButton sline;
JPanel p,p1;
JMenuBar m;
JMenu m1,m2,m3,m4;
JMenuItem m11,m12,m13,m14,m21,m22,m23,m31,m32,m41,m42;
//////////////////////////////////////////////////////////////////
class MOUSEMOVE2 implements MouseMotionListener{ /// 鼠标 /
public void mouseMoved(MouseEvent e){ /// /
/// 拖动 /
} /// /
public void mouseDragged(MouseEvent e){ /// /
Graphics g=getGraphics(); { /// 画线/
int x=1,y=9;int a=1,b=1; /// /
x=e.getX();y=e.getY();
g.setColor(Color.blue); /// /
g.drawLine(a,b,x,y); /// /
a=x;b=y; /// 的 /
/// /
} /// /
} /// 类 /
} /// /
/////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
class MOUSEMOVE implements MouseMotionListener{ /// 鼠标 /
public void mouseMoved(MouseEvent e){ /// /
/// 拖动 /
} /// /
public void mouseDragged(MouseEvent e){ /// /
Graphics g=getGraphics(); /// 画虚线/
int c=0,d=1300; /// /
c=e.getX();d=e.getY(); /// /
if(c>=100&&d<=500&&d>=60){ /// /
g.setColor(Color.red); /// 的 /
g.drawRect(c,d,1,1); /// /
} /// /
} /// 类 /
} /// /
/////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
class MouseC extends MouseAdapter implements MouseListener { /// 鼠标 /
public void mouseClicked(MouseEvent e) { /// /
Graphics g=getGraphics(); /// 点击画 /
int a=10,b=10;int a1=0,b1=0; /// /
/// 连续 /
a1=e.getX();b1=e.getY(); /// /
g.drawLine(a,b,a1,b1); /// 直线 /
a1=a;b1=b; /// /
} /// 的类 /
} /// /
///////////////////////////////////////////////////////////////////////////////////就是这个类有问题!
public dr(){
line= new JButton("----");
line.setBounds(10,100,50,50);
line.setForeground(Color.blue);
line.setBackground(Color.pink);
zline= new JButton("____");
zline.setBounds(10,300,50,50);
zline.setForeground(Color.black);
zline.setBackground(Color.pink);
sline= new JButton("***");
sline.setBounds(10,400,50,50);
sline.setForeground(Color.black);
sline.setBackground(Color.pink);
close=new JButton("x");
close.setBounds(10,200,50,50);
close.setForeground(Color.red);
close.setBackground(Color.pink);
p=new JPanel();
p1=new JPanel();
p.setBounds(0,0,70,700);
p.setBackground(Color.yellow);
p1.setBounds(20,500,1200,200);
p1.setBackground(Color.yellow);
add(p1);
add(p);
p.add(sline);
p.add(zline);
p.add(close);
p.add(line);
m=new JMenuBar();
setJMenuBar(m);
m1=new JMenu("文件");
m2=new JMenu("编辑");
m3=new JMenu("工具");
m4=new JMenu("帮助");
m.add(m1);
m.add(m2);
m.add(m3);
m.add(m4);
m11=new JMenuItem("新建");
m12=new JMenuItem("打开");
m13=new JMenuItem("保存");
m14=new JMenuItem("页面设置");
m1.add(m11);
m1.add(m12);
m1.add(m13);
m1.add(m14);
m21=new JMenuItem("撤销");
m22=new JMenuItem("重复");
m23=new JMenuItem("全选");
m2.add(m21);
m2.add(m22);
m2.add(m23);
m31=new JMenuItem("颜料盒");
m32=new JMenuItem("工具箱");
m3.add(m31);
m3.add(m32);
m41=new JMenuItem("关于画图板");
m42=new JMenuItem("帮助主题");
m4.add(m41);
m4.add(m42); //------------------设置监听器(按钮)--------------------------//
close.addActionListener(this);
line.addActionListener(this);
zline.addActionListener(this);
sline.addActionListener(this);
////////////////////////////////////////////////////////////////
setLayout(null);
p.setLayout(null);
setTitle("~~~~~~~~~画板~~~~~~~~~");
setSize(400,600);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//----------------事件判断及其处理--------------------------//
public void actionPerformed(ActionEvent e){
if(e.getSource()==close) dispose();
else if(e.getSource()==line){
this.addMouseMotionListener(new MOUSEMOVE());
}
else if(e.getSource()==zline){
this.addMouseListener(new MouseC());
}
else if(e.getSource()==sline){
this.addMouseMotionListener(new MOUSEMOVE2());
}
}
//------------------------主控函数-------------------------------///
public static void main(String[] args){
new dr();
}
}
import java.awt.*;
import java.awt.Component.*;
import java.awt.event.*;
import java.awt.image.*;public class dr extends JFrame implements ActionListener{
JButton close;
JButton line;
JButton zline;
JButton sline;
JPanel p,p1;
JMenuBar m;
JMenu m1,m2,m3,m4;
JMenuItem m11,m12,m13,m14,m21,m22,m23,m31,m32,m41,m42;
//////////////////////////////////////////////////////////////////
class MOUSEMOVE2 implements MouseMotionListener{ /// 鼠标 /
public void mouseMoved(MouseEvent e){ /// /
/// 拖动 /
} /// /
public void mouseDragged(MouseEvent e){ /// /
Graphics g=getGraphics(); { /// 画线/
int x=1,y=9;int a=1,b=1; /// /
x=e.getX();y=e.getY();
g.setColor(Color.blue); /// /
g.drawLine(a,b,x,y); /// /
a=x;b=y; /// 的 /
/// /
} /// /
} /// 类 /
} /// /
/////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
class MOUSEMOVE implements MouseMotionListener{ /// 鼠标 /
public void mouseMoved(MouseEvent e){ /// /
/// 拖动 /
} /// /
public void mouseDragged(MouseEvent e){ /// /
Graphics g=getGraphics(); /// 画虚线/
int c=0,d=1300; /// /
c=e.getX();d=e.getY(); /// /
if(c>=100&&d<=500&&d>=60){ /// /
g.setColor(Color.red); /// 的 /
g.drawRect(c,d,1,1); /// /
} /// /
} /// 类 /
} /// /
/////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
class MouseC extends MouseAdapter implements MouseListener { /// 鼠标 /
public void mouseClicked(MouseEvent e) { /// /
Graphics g=getGraphics(); /// 点击画 /
int a=10,b=10;int a1=0,b1=0; /// /
/// 连续 /
a1=e.getX();b1=e.getY(); /// /
g.drawLine(a,b,a1,b1); /// 直线 /
a1=a;b1=b; /// /
} /// 的类 /
} /// /
///////////////////////////////////////////////////////////////////////////////////就是这个类有问题!
public dr(){
line= new JButton("----");
line.setBounds(10,100,50,50);
line.setForeground(Color.blue);
line.setBackground(Color.pink);
zline= new JButton("____");
zline.setBounds(10,300,50,50);
zline.setForeground(Color.black);
zline.setBackground(Color.pink);
sline= new JButton("***");
sline.setBounds(10,400,50,50);
sline.setForeground(Color.black);
sline.setBackground(Color.pink);
close=new JButton("x");
close.setBounds(10,200,50,50);
close.setForeground(Color.red);
close.setBackground(Color.pink);
p=new JPanel();
p1=new JPanel();
p.setBounds(0,0,70,700);
p.setBackground(Color.yellow);
p1.setBounds(20,500,1200,200);
p1.setBackground(Color.yellow);
add(p1);
add(p);
p.add(sline);
p.add(zline);
p.add(close);
p.add(line);
m=new JMenuBar();
setJMenuBar(m);
m1=new JMenu("文件");
m2=new JMenu("编辑");
m3=new JMenu("工具");
m4=new JMenu("帮助");
m.add(m1);
m.add(m2);
m.add(m3);
m.add(m4);
m11=new JMenuItem("新建");
m12=new JMenuItem("打开");
m13=new JMenuItem("保存");
m14=new JMenuItem("页面设置");
m1.add(m11);
m1.add(m12);
m1.add(m13);
m1.add(m14);
m21=new JMenuItem("撤销");
m22=new JMenuItem("重复");
m23=new JMenuItem("全选");
m2.add(m21);
m2.add(m22);
m2.add(m23);
m31=new JMenuItem("颜料盒");
m32=new JMenuItem("工具箱");
m3.add(m31);
m3.add(m32);
m41=new JMenuItem("关于画图板");
m42=new JMenuItem("帮助主题");
m4.add(m41);
m4.add(m42); //------------------设置监听器(按钮)--------------------------//
close.addActionListener(this);
line.addActionListener(this);
zline.addActionListener(this);
sline.addActionListener(this);
////////////////////////////////////////////////////////////////
setLayout(null);
p.setLayout(null);
setTitle("~~~~~~~~~画板~~~~~~~~~");
setSize(400,600);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//----------------事件判断及其处理--------------------------//
public void actionPerformed(ActionEvent e){
if(e.getSource()==close) dispose();
else if(e.getSource()==line){
this.addMouseMotionListener(new MOUSEMOVE());
}
else if(e.getSource()==zline){
this.addMouseListener(new MouseC());
}
else if(e.getSource()==sline){
this.addMouseMotionListener(new MOUSEMOVE2());
}
}
//------------------------主控函数-------------------------------///
public static void main(String[] args){
new dr();
}
}
{
//定义一个当前绘制类型
int LINE = 0;
int RECT = 1;
int currentShape;//在菜单或者按钮事件中将次值设置为合适的绘制类型
Vector v = new Vector();//将要绘制的集合 public void paint(Graphics g)//自动调用
{
//对集合进行遍历,绘制其中的对象
for(int i = 0; i<v.size(); i++)
{
v.get(i).draw(g);//每个对象自己的绘制方法
//或者
g.drawXXX();//根据类型绘制型状
}
}
}绘制对象:
abstract class Shape{
int sx,sy;//起点
int ex,ey;//终点
Color c;//色彩
public void draw(Graphics g);
}class Line extends Shape{ public void draw(Graphics g){}
}
一:画出新的直线后没有把旧的直线清除,解决方案:继续Frame而不是Jframe
二:也就是和你一样的问题,解决方案:用GeneralPath类,的moveTo(),lineTo()方法
{
//定义一个当前绘制类型
int LINE = 0;
int RECT = 1;
int currentShape;//在菜单或者按钮事件中将次值设置为合适的绘制类型
Vector v = new Vector();//将要绘制的集合 public void paint(Graphics g)//自动调用
{
//对集合进行遍历,绘制其中的对象
for(int i = 0; i <v.size(); i++)
{
v.get(i).draw(g);//每个对象自己的绘制方法
//或者
g.drawXXX();//根据类型绘制型状
}
}
} 绘制对象:
abstract class Shape{
int sx,sy;//起点
int ex,ey;//终点
Color c;//色彩
public void draw(Graphics g);
} class Line extends Shape{ public void draw(Graphics g){}
}
楼主可以用一个ArrayList或Vector保存所有的画点,然后再响应重绘方法,每次当窗口改变时,将ArrayList或Vector保存的画点在重新画到画布上.