利用Java自带的awt和swing工具包以及动作监视器、鼠标监视器可以实现简单的画图板的功能。今天,我们就以画图板为例,实现画出简单的直线、矩形、圆形、普通三角形、直角三角形、等腰三角形以及改变它们颜色的功能。
第一步,我们不妨先想想实现这样一个画图板界面上需要什么:选择图形的按钮和颜色选择器。
1.用JFrame建立轮廓;
2.设置布局器(这里用到了边框布局器和流式布局器);
3.设置按钮。
这样,一个简单的界面就做好了,源代码如下:
package 画图板;
import javax.swing.*;
import java.awt.*;
public class DrawPad {
public void initDrawPad(){
JFrame jf=new JFrame();
jf.setTitle("画图板");
jf.setSize(1600,1000);
jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);//3
jf.setLocationRelativeTo(null);//居中
JLabel jlb=new JLabel();
//边框布局器
BorderLayout bdl=new BorderLayout();
jf.setLayout(bdl);
JPanel njp=new JPanel();
JPanel cjp=new JPanel();
njp.setBackground(Color.lightGray);
njp.setPreferredSize(new Dimension(0,80));;
FlowLayout fl = new FlowLayout();//实例化流式布局器
njp.setLayout(fl); //设置布局器
jf.add(njp,BorderLayout.NORTH);
jf.add(cjp,BorderLayout.CENTER);
//设置空标签的尺寸
Dimension nulldms=new Dimension(800,70);
jlb.setPreferredSize(nulldms);
Dimension btndms=new Dimension(100,50);
//添加直线按钮
JButton btnl=new JButton("直线");
btnl.setPreferredSize(btndms);
//添加圆按钮
JButton btnr=new JButton("三角形");
btnr.setPreferredSize(btndms);
//添加矩形按钮
JButton btnc=new JButton("矩形");
btnc.setPreferredSize(btndms);
//添加圆形按钮
JButton btny=new JButton("圆形");
btny.setPreferredSize(btndms);
//添加直角三角形按钮
JButton btnrt=new JButton("直角三角形");
btnrt.setPreferredSize(btndms);
//添加等腰三角形按钮
JButton btnet=new JButton("等腰三角形");
btnet.setPreferredSize(btndms);
//颜色按钮的大小
Dimension cldms=new Dimension(20,20);
//添加颜色按钮
JButton clr=new JButton();
clr.setBackground(Color.black);
clr.setPreferredSize(cldms);
njp.add(btnl);
njp.add(btnc);
njp.add(btnr);
njp.add(btny);
njp.add(btnrt);
njp.add(btnet);
njp.add(jlb);
njp.add(clr);
jf.setVisible(true);
//实例化DrawPad对象
DrawListener dl=new DrawListener();
cjp.addMouseListener(dl);
btnl.addActionListener(dl);
btnr.addActionListener(dl);
btnc.addActionListener(dl);
btny.addActionListener(dl);
btnrt.addActionListener(dl);
btnet.addActionListener(dl);
clr.addActionListener(dl);
//取到画笔对象
Graphics g=cjp.getGraphics();
dl.g=g;
}
public static void main(String []args){
DrawPad drawPad=new DrawPad();
drawPad.initDrawPad();
}
}
第二步,给按钮添加功能,点击直线时就画直线,点击红色时颜色就转变为红色。
1.用动作监听器时时监视我们的“动作”。利用动作监听器,可以取到按钮中的字体颜色等,方面我们作出判断。用法如下:
public class DrawListener implements ActionListener{}
注意,监听器里面的抽象方法必须重写(即使你没用到)
在动作监听器当中,利用某些特定的函数可以实现字符串等的获取,可以参见下面的源代码。
2.用鼠标监听器可以时时监听我们鼠标的“动向”,鼠标监听器里面有四个方法,分别表示了鼠标点击、进入、释放、退出四个动作。在这四个方法中,可以取点,完成图形的构造。
3.下面,就是图形的制作。画直线需要两个点,三角形三个点,矩形两个对角点和长宽。
监听器部分的源代码如下:
package 画图板;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import com.sun.org.apache.xalan.internal.xsltc.compiler.sym;
import java.awt.*;
public class DrawListener implements MouseListener,ActionListener{
int x1,y1,x2,y2,x3,y3,x4,y4,x5,y5;
int i=1;
Color cl;
String btnstr="";
Graphics g;
public void actionPerformed(ActionEvent e) {
btnstr = e.getActionCommand();//取到字符串
System.out.println(btnstr);
if ("".equals(btnstr)) {
//设置颜色
JColorChooser jcc=new JColorChooser();
cl=jcc.showDialog(null,"颜色选择器",null);
JButton button = (JButton) e.getSource();
button.setBackground(cl);
g.setColor(cl);
}
}
public void mouseClicked(MouseEvent e){
System.out.println("点击");
if(btnstr.equals("三角形")){
if(i==1){
x1=e.getX();
y1=e.getY();
System.out.println("x1="+x1);
}
if(i==2){
x2=e.getX();
y2=e.getY();
System.out.println("x2="+x2);
}
if(i==3){
x3=e.getX();
y3=e.getY();
System.out.println("x3="+x3);
g.drawLine(x1, y1, x2, y2);
g.drawLine(x1, y1, x3, y3);
g.drawLine(x3, y3, x2, y2);
i=0;
}
i+=1;
}
}
public void mousePressed(MouseEvent e){
System.out.println("按下");
if(btnstr.equals("直线")||btnstr.equals("矩形")||btnstr.equals("圆形")||btnstr.equals("直角三角形")||btnstr.equals("等腰三角形")){
x4=e.getX();
y4=e.getY();
}
}
public void mouseReleased(MouseEvent e){
System.out.println("释放");
if(btnstr.equals("直线")||btnstr.equals("矩形")||btnstr.equals("圆形")||btnstr.equals("直角三角形")||btnstr.equals("等腰三角形")){
x5=e.getX();
y5=e.getY();
}
if(btnstr.equals("矩形"))
g.drawRect(Math.min(x4, x5), Math.min(y4, y5), Math.abs(x4-x5), Math.abs(y4-y5));
if(btnstr.equals("直线"))
g.drawLine(x4, y4, x5, y5);
if(btnstr.equals("圆形"))
g.fillOval(x4, y4, Math.abs(x4-x5), Math.abs(y4-y5));
if(btnstr.equals("直角三角形")){
g.drawLine(x4, y4, x5, y5);
g.drawLine(x4, y4, x4, y5);
g.drawLine(x5, y5, x4, y5);
}
if(btnstr.equals("等腰三角形")){
g.drawLine(x4, y4, x5, y5);
g.drawLine(x4, y4, 2*x4-x5, y5);
g.drawLine(x5, y5,2*x4-x5, y5);
}
}
public void mouseEntered(MouseEvent e){
System.out.println("进入");
}
public void mouseExited(MouseEvent e){
System.out.println("退出");
}
}