当我们为一个组件添加事件监听器的时候,常常需要写一个该监听器的实现类,在这个实现类内部写事件处理方法。 而其中比较麻烦的一点就是我们需要将事件源及其他一些参数传入到这个实现类中,而且在实现类中定义相应的属性来保存这些参数,以便在事件处理方法中使用。当需要传入的参数比较多时,这样的方法显然不太方便。
通过内部类创建监听器则能比较好地解决这一问题。示例如下:
// 通过内部类创建滑条监听器 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(); } }
相关推荐
然而,描述中提到的一个限制是,外部类形式的事件监听器不能自由地访问创建GUI界面的方法和组件。 在Android中,通常我们会在Activity或Fragment这样的UI组件内部定义匿名内部类来实现监听器,这样可以直接访问到UI...
"匿名内部类作为事件监听器"这一主题主要涉及如何在不创建独立类的情况下为UI组件如按钮(Button)添加事件监听功能。下面我们将深入探讨这个话题。 首先,Android中的事件处理通常基于监听器接口。例如,`...
这意味着,如果一个监听器需要访问外部类的成员变量,匿名内部类可以直接访问,但静态内部类则需要通过持有对外部类的引用。 **总结** 在Android开发中,匿名内部类作为事件监听类是常见且实用的技术手段,它简化了...
匿名内部类可以用来快速实现简单的功能,比如创建事件监听器,简化代码的同时提高可读性。 **应用场景** 1. **事件处理**: 在Android开发中,匿名内部类经常用于实现View的点击事件监听器,如OnClickListener。 2...
- **静态内部类**:也称为静态嵌套类,这种内部类通过`static`关键字修饰,不能直接访问外部类的实例成员,只能访问外部类的静态成员。 - **局部内部类**:是在一个方法或构造器内部定义的类,可以访问该方法或构造...
这种访问权限使得内部类可以方便地实现一些复杂的逻辑,如事件监听器。但需要注意的是,由于这种紧密耦合,内部类实例不能独立于外部类实例存在,也就是说,必须先创建外部类对象,才能创建内部类对象。 静态内部类...
Java 内部类是一种高级特性,允许在一个类的定义内部创建另一个类。这种设计模式提供了更灵活的代码组织方式,同时还可以实现特定的封装和访问控制。内部类主要分为四种类型:静态内部类、成员内部类、局部内部类和...
事件监听器的实现方式有多种,本篇文章将介绍四种常见的事件监听器实现方式:自身类作为事件监听器、外部类作为事件监听器、匿名内部类作为事件监听器和内部类作为事件监听器。 1. 自身类作为事件监听器 在这个...
这是因为成员内部类对象在外部类对象内部创建,它们之间有隐含的引用关系。这种类通常用于实现特定的逻辑或者封装与外部类紧密关联的数据。 3. **局部内部类**: 局部内部类只在方法、构造器或者块中定义,其作用...
这种设计模式在处理特定问题时提供了更大的灵活性,比如实现事件监听器、封装复杂逻辑或者创建私有的辅助类。本章我们将深入探讨内部类的种类、用法以及其优势。 1. **成员内部类**: - 成员内部类就像普通类的...
它们通常与接口或抽象类一起使用,例如作为参数传递或者快速创建事件监听器。以下是一个使用匿名类的例子: ```java interface MyInterface { void printMessage(); } public class Test2 { public void ...
在Java编程语言中,内部类是一种特殊的类,...通过合理地利用内部类,我们可以创建更加灵活、结构清晰的控制器,提高代码的复用性和可读性。在实际项目中,理解并掌握这部分知识对于编写高质量的Java应用程序至关重要。
通过熟练掌握Java监听器机制,开发者可以创建更加响应用户输入的、交互性强的应用程序。 在提供的压缩包文件“05_监听器”中,可能包含更多关于Java监听器的实例代码和讲解,可以帮助深入理解这一主题。建议查看...
例如,事件监听器的回调函数常常使用匿名内部类来实现。 2. **匿名内部类的声明与实例化** 匿名内部类可以直接在需要的地方声明并实例化,格式如下: ```java new InterfaceName() { // 实现接口方法 }; ``` ...
在Android开发中,匿名内部类的应用尤其广泛,因为Android框架中的许多组件(如按钮、文本视图等)都需要通过监听器来响应用户的交互事件。 匿名内部类的基本概念: 匿名内部类可以直接定义在一个类的内部,它可以...
此外,在Java Swing和JavaFX等图形用户界面库中,内部类常用于事件监听器的实现,因为它们可以方便地访问和修改外部类的状态。 在实际开发中,合理使用内部类可以提高代码的可读性和可维护性,但也要注意避免过度...
内部类的一个重要应用场景是在事件处理中,例如Swing或Android开发,它们经常用内部类来实现事件监听器。内部类可以轻松地访问外部类的成员,使得代码结构清晰且易于理解。 接下来,让我们转向Stream API。Java 8...
- **作为回调机制**:内部类常用于实现事件监听器等回调机制,因为它们可以轻松地访问外部类的成员。 3. **示例解析**: 在给定的示例中,`Goods` 类有两个内部类:`Content` 和 `GDestination`。`Content` 是一...
- 当需要实现回调或监听器机制时,内部类可以作为接口的匿名实现,简化代码结构。 总之,Java的内部类提供了一种灵活的编程方式,能够更好地组织代码结构,实现复杂的逻辑和设计模式。合理使用内部类可以使代码更...
匿名内部类广泛应用于Java集合框架中的比较器(Comparator)、线程(Thread)的创建、事件监听(如ActionListener)等场景。 通过以上讲解,我们可以看出Java匿名内部类在编写简洁、高效的代码方面发挥了重要作用...