当我们为一个组件添加事件监听器的时候,常常需要写一个该监听器的实现类,在这个实现类内部写事件处理方法。 而其中比较麻烦的一点就是我们需要将事件源及其他一些参数传入到这个实现类中,而且在实现类中定义相应的属性来保存这些参数,以便在事件处理方法中使用。当需要传入的参数比较多时,这样的方法显然不太方便。
通过内部类创建监听器则能比较好地解决这一问题。示例如下:
// 通过内部类创建滑条监听器
jsR.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
// 调用本类内部的事件处理方法
processEvent(jsR, "R", jtfR);
}
});
然后将所需传入的参数定义为全局变量,并写一个processEvent()方法即可
// 将JSlider定义为属性,其对象可以在其他方法中使用
private JSlider jsR, jsG, jsB;
// 将JTextField定义为属性,其对象可以在其他方法中使用
private JTextField jtfR, jtfG, jtfB;
并写一个processEvent()方法即可
private void processEvent(JSlider js, String color, JTextField jtf) {
int value = js.getValue();
System.out.println("当前js" + color + "的值为:" + value);
String jtfColor = "" + value;
if (color.equals("R")) {
R = value;
jtfR.setText(jtfColor);
}
if (color.equals("G")) {
G = value;
jtf.setText(jtfColor);
}
if (color.equals("B")) {
B = value;
jtf.setText(jtfColor);
}
// 根据当前RGB画画
g.setColor(new Color(R, G, B));
g.fillOval(400, 400, 200, 200);
System.out.println("当前RGB的值为:" + "(" + R + "," + G + "," + B + ")");
}
下面是我的一个完整程序。其中用到了三个JSlider来调节RGB值并画图案相应颜色的圆,我只写了一个processEvent()方法, 根据其传入的参数color来判断为哪一个JSlider,并作相应操作。
方法中最后一步是画出当前RGB值对应颜色的图形,需要对三个JSlider的值进行监听,通过全局变量比较好地解决了这一问题。一开始我试过用外部类创建事件监听器的方法,不但要创建三个实现类,而且要将三个监听器中的得到的RGB值传入到每个监听器中,再画出图形,相当麻烦!
所以建议大家采用这种内部类创建监听器的方法。
package myColor20130711;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
* @author zlf
*
*/
public class TestColor extends JFrame {
public static void main(String[] args) {
TestColor tc = new TestColor();
tc.initGUI();
}
// 计数器
private int count = 0;
// 将JSlider定义为属性,其对象可以在其他方法中使用
private JSlider jsR, jsG, jsB;
// 将JTextField定义为属性,其对象可以在其他方法中使用
private JTextField jtfR, jtfG, jtfB;
// 颜色值
private int R, G, B;
// 画布
private Graphics g;
/**
* 事件发生时,调用处理方法
*
* @param js
* 發生事件的JSlider
* @param color
* 发生事件的JSlider对应的颜色:R或G或B
* @param jtf
* 发生事件的JSlider对应的文本框
*/
private void processEvent(JSlider js, String color, JTextField jtf) {
int value = js.getValue();
System.out.println("当前js" + color + "的值为:" + value);
String jtfColor = "" + value;
if (color.equals("R")) {
R = value;
jtfR.setText(jtfColor);
}
if (color.equals("G")) {
G = value;
jtf.setText(jtfColor);
}
if (color.equals("B")) {
B = value;
jtf.setText(jtfColor);
}
// 根据当前RGB画画
g.setColor(new Color(R, G, B));
g.fillOval(400, 400, 200, 200);
System.out.println("当前RGB的值为:" + "(" + R + "," + G + "," + B + ")");
}
/**
* 初始化界面方法
*/
public void initGUI() {
this.setTitle("测试颜色");
this.setSize(1000, 700);
this.setDefaultCloseOperation(3);
this.setResizable(true);
this.setLocationRelativeTo(null);
this.setLayout(new FlowLayout());
/*************************** 第一个滑条 *************************************/
jsR = new JSlider();
jsR.setMaximum(255);
jsR.setValue(0);
jsR.setPreferredSize(new Dimension(500, 30));
JLabel jlaR = new JLabel("R");
jtfR = new JTextField(10);
// 通过内部类创建滑条监听器
jsR.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
// 调用本类内部的事件处理方法
processEvent(jsR, "R", jtfR);
}
});
this.add(jsR);
this.add(jlaR);
this.add(jtfR);
/*************************** 第二个滑条 *************************************/
jsG = new JSlider();
jsG.setMaximum(255);
jsG.setValue(0);
jsG.setPreferredSize(new Dimension(500, 30));
JLabel jlaG = new JLabel("G");
jtfG = new JTextField(10);
jsG.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
// 调用本类内部的事件处理方法
processEvent(jsG, "G", jtfG);
}
});
this.add(jsG);
this.add(jlaG);
this.add(jtfG);
/*************************** 第三个滑条 *************************************/
jsB = new JSlider();
jsB.setMaximum(255);
jsB.setValue(0);
jsB.setPreferredSize(new Dimension(500, 30));
JLabel jlaB = new JLabel("B");
jtfB = new JTextField(10);
jsB.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
// 调用本类内部的事件处理方法
processEvent(jsB, "B", jtfB);
}
});
this.add(jsB);
this.add(jlaB);
this.add(jtfB);
this.setVisible(true);
g = this.getGraphics();
}
}