做好了一个漂亮的面板,要实现一个面板的
运作,使之成为一个合格的程序,还需要描述各个组件的具体功能,一个按钮从按下到一个事件的发生,看似很简单,实际却牵动了大量的程序过程:
(1)首先要知道触发这个事件的是那一个具体的组件,也就是外部输入发生动作的地方,称之为事件源。
(2)知道了事件源,然后要添加一个
监听器,来监视这个事件源,看是否有动作发生在这上面。
(3)动作一旦发生,监听器就会发送信号,我们需要创建一个
事件处理类,来处理这个发来的信号,在事件处理类中,添加对这个信号的处理方式,这就是按钮所触发的事件。
(4)最后把事件监听处理类绑定到事件监听器对象上,一个组件的功能就实现了。
制作一个简单地画板:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public
class Drawing {
/**
* @param args
*/
private String actionName;
//主函数入口
public static void main(String[] args) {
// TODO Auto-generated method stub
//建立界面对象
Drawing gui =new Drawing();
gui.InitGUI();//调用界面方法
}
//实例化界面方法
public void InitGUI(){
JFrame jf =new JFrame("
画图板");
jf.setSize(800,450);//设置界面大小
jf.set
DefaultClose
Operation(3);//设置可以关闭
jf.setLocationRelativeTo(null);//设置界面居中显示
JPanel jp1 =new JPanel();//创建一个面板
jp1.setPreferredSize(new Dimension(0,50));//设置面板大小
//创建图形属性值选择项按钮
JButton lin =new JButton("line");
JButton rec =new JButton("rect");
JButton ova =new JButton("oval");
JButton rou =new JButton("roundrect");
JButton pol =new JButton("poly");
//添加图形属性值按钮到面板
jp1.add(lin);
jp1.add(rec);
jp1.add(ova);
jp1.add(rou);
jp1.add(pol);
jf.add(jp1,BorderLayout.NORTH);//添加面板到布局
JPanel jp2 =new JPanel();//新建一个面板
jp2.setBackground(Color.WHITE);//设置背景颜色为白色
jf.add(jp2,BorderLayout.CENTER);//将jp2面板添加到中间布局
jf.setVisible(true);//设置窗体可见
Graphics g = jp2.getGraphics();//获取该事件源面板的绘图工具
//this在此构造方法内表示当前Drawing类的对象,不可换成该对象的对象名
DrawingEvents de= new DrawingEvents(this,g);
jp2.addMouseListener(de);
ActionListener al =new ActionListener(){
public void actionPerformed(ActionEvent e) {
actionName = e.getActionCommand();
}
};
lin.addActionListener(al);
pol.addActionListener(al);
rou.addActionListener(al);
ova.addActionListener(al);
rec.addActionListener(al);
}
public String getActionName(){
return actionName;
}
}
—————————————————————————————————————————
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class DrawingEvents implements MouseListener{
private int x1,x2,y1,y2;
private Drawing gui;
private Graphics g;
public DrawingEvents (Drawing gui,Graphics g){
this.g =g;
this.gui=gui;
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠标单击");
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠标进入");
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠标移除");
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
x1=e.getX();
y1=e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
x2=e.getX();
y2=e.getY();
if(gui.getActionName().equals("line")){
System.out.println(gui.getActionName());
g.drawLine(x1, y1, x2, y2);
}
else if(gui.getActionName().equals("rect")){
System.out.println(gui.getActionName());
if(x2>=x1){
if(y2>=y1){
g.drawRect(x1, y1, x2-x1,y2-y1);
}
else{
g.drawRect(x1, y2, x2-x1,y1-y2);
}
}
else if(y1>=y2){
g.drawRect(x2, y2, x1-x2,y1-y2);
}
else{
g.drawRect(x2, y1, x1-x2,y2-y1);
}
}
else if(gui.getActionName().equals("oval")){
System.out.println(gui.getActionName());
if(x2>=x1){
if(y2>=y1){
g.drawOval(x1, y1, x2-x1,y2-y1);
}
else{
g.drawOval(x1, y2, x2-x1,y1-y2);
}
}
else if(y1>=y2){
g.drawOval(x2, y2, x1-x2,y1-y2);
}
else{
g.drawOval(x2, y1, x1-x2,y2-y1);
}
}
else if(gui.getActionName().equals("roundrect")){
System.out.println(gui.getActionName());
if(x2>=x1){
if(y2>=y1){
g.drawRoundRect(x1, y1, x2-x1,y2-y1,40,40);
}
else{
g.drawRoundRect(x1, y2, x2-x1,y1-y2,40,40);
}
}
else if(y1>=y2){
g.drawRoundRect(x2, y2, x1-x2,y1-y2,40,40);
}
else{
g.drawRoundRect(x2, y1, x1-x2,y2-y1,40,40);
}
}
}
}
在这个过程中,最容易出现
空值问题,所以要仔细
把握传参数的过程,可能对一个接触JAVA不久的人来说,对于引用传递和参数传递的
理解会是个很大的问题,但随着代码量的
积累,应该会渐渐理解其中的含义
- lesson06.zip (2.9 KB)
- 下载次数: 0