之前讲了java的第一课,也就是图形界面的开发,学习了组件的应用,但是还有一个特别的问题没有解决,那就是之前我只是实现了一个界面而已,但是实际操作中,只有一个界面是没有用的,因为我们还需要点击“登录”按钮的时候,弹出登录之后的界面,那么怎么实现这个工能呢,这就需要事件监听了。
那么首先介绍几个概念,事件、事件源、事件监听方法、事件接口。第一个包括了后面三个。
1.事件源:
(1).有哪些内容可以成为事件源?
所有的容器组件和元素组件可以成为事件源。AWT组件,SWING组件
(2).如何在界面上确定谁是事件源对象呢?
你的动作发生在哪一个组件上,那么该组件就是事件源对象。
2.事件监听方法:
(1).addActionListener(ActionListener l);
监听事件源对象上是否会发生鼠标点击(类似按钮)或者键盘的回车(输入框组件)动作,如果有这些动作发生,则该方法会捕获到动作,交给参数ActionListener类型的对象去处理。
(2).addMouseListener(MouseListener l);
监听事件源对象上是否有鼠标的进入,离开,按下,释放和单击动作,如果有这些动作发生,则该方法会捕获到动作,交给参数MouseListener类型的对象去处理。
(3).addMouseMotionListener(MouseMotionListener l)
监听事件源对象上是否有鼠标的移动和拖动动作,如果有这些动作发生,则该方法会捕获到动作,交给参数MouseMotionListener类型的对象去处理。
(4).addKeyListener(KeyListener l);
监听事件源对象上是否有键盘按键按下,释放和敲击动作,如果有这些动作发生,则该方法会捕获到动作,交给参数KeyListener类型的对象去处理。
3.事件接口(事件处理类)
ActionListener
动作事件接口
MouseListener
鼠标事件接口
MouseMotionListener
鼠标移动事件接口
KeyListener
键盘事件接口
定义类实现接口,这个类就是事件处理类。在此强调,这些都是接口,所以实现这些接口的时候要实现这些接口里面所有的方法。
总结一下,大体就是当我们想做一个事件监听的时候,先明确事件源,再确定要用哪个事件监听方法,然后定义事件处理类,最后在事件源上添加上这个监听方法就可以啦!
**************************************************************************************************
好了,上面介绍了关于事件的基础知识,但是实践出真知,接下来我们可以做一个简单的画板,比如可以调颜色,可以画直线,画矩形,画直角三角形,同样的,和上篇文章一样,我只把最原始的程序贴出来,觉得这样更有意思,哈哈哈。
首先我们要做一个画板,就首先要有一个窗体,才能在上面选择图形,颜色以及画图,至于怎么定义窗口呢, 这里不再多说,直接贴出代码:
<span style="white-space:pre"> </span>JFrame frame=new JFrame();
frame.setTitle("drawdboard");
frame.setSize(700,500);
FlowLayout f1=new FlowLayout(FlowLayout.LEFT);
frame.setLayout(f1);
frame.setDefaultCloseOperation(3);
frame.setLocationRelativeTo(null);
在这里又要提出一个东西叫做Graphics,因为我们要画画嘛,就要有一个画板,这个就可以理解成为画板类,要想画出图形就要用到这个类。不过这个类有一个好处就是我们可以直接从窗体上获得,贴出代码就知道了:
<span style="white-space:pre"> </span>Graphics gg=frame.getGraphics();//声明对象,直接从窗体上获得
接下来我们就要布置画板了,首先理顺一下,画板最起码要有颜色的选择、图形的选择以及橡皮擦,还有一个画图的地方。那么这次我们实现的画板就包含这几个部分。
因为颜色有好几种,图形也是,那么我们可以用数组来储存相应的信息。
先贴出代码吧:
<span style="white-space:pre"> </span>String array[]={"直线","曲线","矩形","直角三角形"};
Color colors[]={Color.BLACK,Color.BLUE,Color.GRAY,Color.GREEN,Color.PINK,new Color(100,210,220)};
JPanel panel1= new JPanel();
panel1.setBackground(new Color(200,210,220));//设置颜色
panel1.setPreferredSize(new Dimension(300,50));//设置大小
panel1.setLayout(new FlowLayout(FlowLayout.LEFT));//设置布局
JPanel panel2=new JPanel();
panel2.setBackground(new Color(190,200,210));
panel2.setPreferredSize(new Dimension(300,50));
panel2.setLayout(new FlowLayout(FlowLayout.LEFT));
这里做一下解释,首先大家不用疑惑String和Color都是类型,和c++不一样吧,恩,很不一样。再就是JPanel,这个东西我们在上一篇文章说过,他就相当于一个小窗体。。。为什么这样因为,我们用的是流式布局,必须填满一行才能填下一行,这不是很方便,如果我们可以把一个窗体分成几个部分是不是就容易多了,虽然JPanel的对象在窗体中也是流式布局,但是我们可以在一个相对独立的小块中添加我们想要的东西,这样就美观的多。
那么接下来就到了比较关键的部分就是如果我们添加上这些选择的按钮,我们要点击这些按钮得到相应的效果才行,这就需要用到了事件监听了,比如点击“直线”我们可以画一条直线,
先大体说一下,如果在两点之间画一条直线,我们只需要在按下鼠标的时候记录一个点,松开鼠标的时候记录一个点,那么在松开鼠标的时候画一条直线就ok了,这样我们需要用到MouseListener这个事件接口。那么如果我们想实现按下鼠标,边拖动鼠标边画线怎么办呢??很简单,我们需要不断的记录点不断的画线就好了,要用到MouseMotionListener这个事件接口。
好了,直接贴出事件处理类的代码吧:
package graph;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Graph extends MouseAdapter implements ActionListener{
private int x1,y1,x2,y2;
private int x11,y11,x22,y22;
private String type="直线";
Color color=Color.BLACK;
private Graphics2D g;
private JFrame frame;
public Graph(JFrame frame)
{
this.frame=frame;
frame.setVisible(true);
this.g=(Graphics2D)frame.getGraphics();
}
public void mousePressed(MouseEvent e)
{
x1=e.getX();
y1=e.getY();
x11=x1;
y11=y1;
}
public void mouseReleased(MouseEvent e)
{
x2=e.getX();
y2=e.getY();
if(type.equals("直线"))
g.drawLine(x1, y1, x2, y2);
else if(type.equals("矩形"))
{
g.drawLine(x1,y1,x1,y2);
g.drawLine(x1,y1,x2,y1);
g.drawLine(x2,y1,x2,y2);
g.drawLine(x1,y2,x2,y2);
}else if(type.equals("直角三角形"))
{
g.drawLine(x1,y1,x2,y2);
g.drawLine(x1,y1,x1,y2);
g.drawLine(x1,y2,x2,y2);
}
}
public void mouseDragged(MouseEvent e)
{
if(type.equals("曲线"))
{
x22=e.getX();
y22=e.getY();
g.drawLine(x11, y11, x22, y22);
x11=x22;
y11=y22;
}else if(type.equals("橡皮"))
{
x22=e.getX();
y22=e.getY();
color=frame.getBackground();
g.setStroke(new BasicStroke(20));
g.setColor(color);
g.drawLine(x11, y11, x22, y22);
x11=x22;
y11=y22;
}
}
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand().equals(""))
{
JButton but=(JButton) e.getSource();
color=but.getBackground();
g.setColor(color);
}else
{
type=e.getActionCommand();
}
}
}
代码没有注释,并不是因为偷懒,只是觉得太简单,不需要注释。。。。。。。有些方法像getActionCommand()、getX()等等,大家可以自己百度,这里就不费口舌了。
那么最后一步就是给每个按钮加上监听方法了:
<span style="white-space:pre"> <span style="font-size:18px;"> </span></span><span style="font-size:18px;">for(int i=0;i<array.length;i++)
{
JButton but=new JButton(array[i]);//添加按钮
// but.setPreferredSize(new Dimension(70,20));
but.addActionListener(g1);//添加监听方法
panel1.add(but);//给JPanel组件添加这个按钮
}
for(int i=0;i<colors.length;i++)
{
JButton but=new JButton();
but.setBackground(colors[i]);
but.setPreferredSize(new Dimension(30,20));
but.addActionListener(g1);
panel2.add(but);
}
JButton but=new JButton("橡皮");
but.setPreferredSize(new Dimension(60,20));
but.addActionListener(g1);
//给整个窗体添加这几个JPanel
frame.add(panel1);
frame.add(panel2);
frame.add(but);
frame.setVisible(true);//设置窗口可见
//给这个窗体添加监听方法
frame.addMouseListener(g1);
frame.addMouseMotionListener(g1);</span>
最后贴出整个代码(其中事件处理类在上面已经贴出Graph):
<span style="white-space:pre"> </span>package graph;
<span style="white-space:pre"> </span>import java.awt.*;
<span style="white-space:pre"> </span>import javax.swing.*;
<span style="white-space:pre"> </span>import java.awt.event.*;
<span style="white-space:pre"> </span>import java.awt.color.*;
<span style="white-space:pre"> </span>public class Manager <span style="font-family: Arial, Helvetica, sans-serif;">{</span>
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame=new JFrame();
frame.setTitle("drawdboard");
frame.setSize(700,500);
FlowLayout f1=new FlowLayout(FlowLayout.LEFT);
frame.setLayout(f1);
frame.setDefaultCloseOperation(3);
frame.setLocationRelativeTo(null);
Graphics gg=frame.getGraphics();
Graph g1=new Graph(frame);
String array[]={"直线","曲线","矩形","直角三角形"};
Color colors[]={Color.BLACK,Color.BLUE,Color.GRAY,Color.GREEN,Color.PINK,new Color(100,210,220)};
JPanel panel1= new JPanel();
panel1.setBackground(new Color(200,210,220));
panel1.setPreferredSize(new Dimension(300,50));
panel1.setLayout(new FlowLayout(FlowLayout.LEFT));
JPanel panel2=new JPanel();
panel2.setBackground(new Color(190,200,210));
panel2.setPreferredSize(new Dimension(300,50));
panel2.setLayout(new FlowLayout(FlowLayout.LEFT));
for(int i=0;i<array.length;i++)
{
JButton but=new JButton(array[i]);
// but.setPreferredSize(new Dimension(70,20));
but.addActionListener(g1);
panel1.add(but);
}
for(int i=0;i<colors.length;i++)
{
JButton but=new JButton();
but.setBackground(colors[i]);
but.setPreferredSize(new Dimension(30,20));
but.addActionListener(g1);
panel2.add(but);
}
JButton but=new JButton("橡皮");
but.setPreferredSize(new Dimension(60,20));
but.addActionListener(g1);
frame.add(panel1);
frame.add(panel2);
frame.add(but);
frame.setVisible(true);
frame.addMouseListener(g1);
frame.addMouseMotionListener(g1);
}
}
最后会得到这样一个画板界面,可以画画哟!: