首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在JButton中添加ActionListener时,这两个相似的for循环会有不同的结果?

在JButton中添加ActionListener时,这两个相似的for循环会有不同的结果是因为它们的执行时机和作用域不同。

第一个for循环的代码如下:

代码语言:java
复制
for (int i = 0; i < 5; i++) {
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println(i);
        }
    });
}

在这个循环中,每次循环都会创建一个新的ActionListener对象,并将其添加到按钮的监听器列表中。当按钮被点击时,每个ActionListener都会执行其actionPerformed方法,并打印变量i的值。然而,由于Java的闭包特性,这里的问题在于变量i是在循环中定义的,而不是在每个ActionListener中定义的。因此,当按钮被点击时,所有的ActionListener都会引用同一个变量i,而这个变量在循环结束后的最终值是5。因此,无论点击哪个按钮,都会打印出5。

第二个for循环的代码如下:

代码语言:java
复制
for (int i = 0; i < 5; i++) {
    final int index = i;
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println(index);
        }
    });
}

在这个循环中,我们引入了一个新的变量index,并将循环变量i的值赋给它。然后,我们在每个ActionListener中引用这个index变量。由于Java的闭包特性,每个ActionListener都会持有一个对应的index变量的副本。因此,当按钮被点击时,每个ActionListener打印的都是它们各自持有的index变量的值,而不是同一个变量。因此,点击不同的按钮会打印出不同的值,分别是0、1、2、3、4。

总结起来,第一个for循环中的ActionListener共享同一个变量i,而第二个for循环中的ActionListener持有各自的变量index副本。这就是为什么它们会有不同的结果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java交互界面实现计算器开发设计【附函数源码】

但同时毕竟是两种不同开发语言,所以具体开发上还是有所不同。...使用Java和C#开发交互界面,最大区别就是: C#交互界面的实现是可以设计模块中直接添加控件并设置其属性,同时还会生成与控件所绑定控件函数, 而Java则不同,Java窗体和控件都需要使用代码来设置...在这里我们需要首先定义私有的全局变量来接收在计算器运行过程一些变量,如输入数值、小数点、操作符、输出框内容、计算结果等,因此对于计算器使用过程可能出现变量要对其进行一一接收。...控件触发集中处理函数 首先是定义控件触发集中处理函数,该函数功能上可以根据实际情况分为两部分,第一部分是我们没有点击运算操作符前,点击数字控件所触发事件,也就是我们输入一个数值要做事情...计算器窗口界面函数 在这两个函数完成之后,就是我们计算器界面设计函数了, 该函数,我们需要对计算器整体界面进行布局设计,同时还需要对每一个控件添加监控,当我们点击相应控件时候,可以触发相应事件操作

1.4K10
  • Java 期末复习 (已完结)

    6 子类不会继承父类构造器*,而是子类被实例化时会默认调用父类空构造器 如果父类构造器被 重载,那么子类构造器也必须初始化父类构造器 举个例子哈 ?...(3, 3, 10, 30));` ★★★★★ ==事件==添加方法 1首先这个类要实现ActionListener接口 public class TestChange implements ActionListener...★Java方法重载:返回类型、修饰符可以相同,也可不同。要求同名方法必须有不同参数表(类型和个数都不同),**仅有返回类型不同是不足以区分两个重载方法。 ?...★线程是能独立运行程序 ★在编写访问数据库Java程序时,ResultSet对象作用是 存储查询结果 ★ this和super ➡不能用在 main() 方法 ★ 字节流,所有的InputStream...和OutputStream子类都是,处理二进制数据,它是按字节来处理 字符流 处理 文本文件 二者 读取字节数 不同 字符流转化为字节流,使用 byte[] String.getBytes

    95930

    比较Swing中三种注册事件方法

    Java Swing处理各组件事件一般步骤是: 1. 新建一个组件。 2. 该组件添加到相应面板。 3....注册事件我们一般采用两种方式:一是:利用一个监听器以及多个if语句来决定是哪个组件产生事件;二是使用多个内部类来响应不同组件产生各种事件,它又分两种方式,一种是采用匿名内部类,一种是采用一般内部类。...当程序比较复杂,需要一大串if语句来实现。程序代码比较难阅读和维护。 一、利用匿名内部类来是实现 [java] view plaincopyprint?...由于它是和事件组一起。根据事件组代码位置不同,类定义以及处理事件,同样不便于阅读。如果事件处理程序比较复杂,内部类代码就会变很长。...它把所有的事件处理方法都集中一块,并且都具有有意义名称,程序非常容易阅读与维护。单个事件处理程序也可以被工具栏、菜单栏等重复使用。

    1K60

    Java课程设计【学生信息管理系统】

    二、基本要求 实现一个功能简单学生信息管理系统,该系统具有按照账户名密码登录功能,登录后,可以添加,删除,修改、查询(显示学生相片)学生信息,添加学生信息,要求能添加学生相片信息(实现相片文件上传和下载功能...在用户名和密码输入正确后进入学生信息管理系统,然后进行添加、修改、删除等操作。添加操作里面可以上传和下载照片,这是File类型。...七、测试结果 测试数据和测试结果在用户使用说明选项已经详细介绍过,这里不再重复介绍。...可以说,没有付出就没有回报,只要你肯付出,就会有收获。一件事,你只要用心去做了,将它做好,无论结果如何,你都不会留有遗憾。...等你有了新圈子,别忘了谁陪你走过了人烟稀少时候;等你过得好,别忘了谁陪你度过了最艰难时刻。路上人山人海,不一定都对你好,但肯定会有一个愿意等。朋友不要多,但要最真。

    5.5K21

    Swing常用组件

    它们都被添加到一个JPanel,并且通过ButtonGroup对象进行分组,以确保只能选择一个选项。当选择一个选项,会显示相应信息JLabel。...JComboBox构造方法有4种重载形式,通过参数陆值可以初始化下拉列表,同时添加下拉列表选项;添加方式有 3 种类型,包括数组、Vecior 类型和ComboBoxModel 模型。...JList 构造方法有4种重载形式,通过参数赋值可以初始化列表,同时添加列表选项:添加方式有3种类型,包括数组、Vector 类型和 ListModel 模型。...而AWT List初始化列表,不能添加列表选项;此外,JList 所创建列表选项可以是任何类型,不再局限于文本字符串。...当点击添加按钮,会弹出一个对话框,要求用户输入新项目的名称,并将其添加到列表。当点击删除按钮,会删除选定项目。整个界面使用JPanel来组织,并且使用了JFrame作为窗口容器。

    10710

    JAVA学习Swing章节按钮组件JButton简单学习

    是较为常见组件,用于触发特定动作 * Swing中提供了多种按钮,包括提交按钮,复选框,单选按钮等 * 这些按钮都是从AbstractButton类中继承而来 * * 2:Swing提交按钮组件...(JButton)由JButton对象表示 * JButton含有4种主要构造方法 * 参数text,icon分别代表显示文字标签和图标 * * 3:本实例使用了两种方式创建按钮,第一种是初始化按钮赋予按钮图标与文字...jb=new JButton("button"+i,icon); container.add(jb);//将按钮添加到容器 if(i%2==0){...* * 3:Swing存在一个ButtonGroup类,用于产生按钮组。...container.add(jp);//将面板添加到容器 //设置容器特性 setTitle("单选按钮简单练习");//容器标题

    3.2K50

    Java课程设计源码——学生信息管理系统 SQL「建议收藏」

    理解成返回一张表行结果集 rs = ps.executeQuery(); // 循环取出 if (rs.next()) { // 将教师用户名和密码取出 userword = rs.getString...赋值(可防止SQL注入漏洞问题),不要直接使用拼接方式 ps.setString(1, s); ps.setString(2, name); // ResultSet结果集,可以把ResultSet理解成返回一张表行结果集...赋值(可防止SQL注入漏洞问题),不要直接使用拼接方式 ps.setString(1, s); // ResultSet结果集,大家可以把ResultSet理解成返回一张表行结果集 rs = ps.executeQuery...赋值(可防止SQL注入漏洞问题),不要直接使用拼接方式 ps.setString(1, s); // ResultSet结果集,大家可以把ResultSet理解成返回一张表行结果集 rs = ps.executeQuery...JBAdd = new JButton("添加"); JButton JBNext = new JButton("重置"); panel1.add(JLNumber); panel1.add(JTNumber

    1.7K30

    java超市仓库管理系统(超市条形码管理系统)

    图1 2、“商品名称”对应JTextField输入商品名称,单击“查询”:如果存在该商品,则显示如图2所示窗体;若输入名称不存在,则弹出“没找到该商品!”对话框。...图2 3、单击“添加商品”按钮,弹出如图3所示窗体,此时必须输入所有商品信息, 否则将弹出如图4所示对话框;当商品信息输入完毕,单击“确定”按钮,实现商品添加弹出如图5所示对话框后,释放窗体...(int x,int y) 或 对象名.setBounds(int x,int y,int Width,int Height) 注意:使用自由布局方式布局JPanel控件,必须设置其大小,当然JPanel...(index,1);//index为选定行索引值 6、在编写代码,最好用方法对重复使用代码进行封装,尽量减少代码冗余; 7、编译程序,并运行。...,请将【GoodsXG.Java】文件变量num改为price。

    3.5K20

    图书管理系统代码 4SearchFrame (…

    ("按编号",true); Radio_name   = new JRadioButton("按书名"); Radio_author = new JRadioButton("按作者"); // 将按钮添加到按钮组...int m = Integer.parseInt(textField.getText()); book_search =(Book)obo.readObject();//先读取第一个对象 // 如果文本框输入文字出现在某个对象执行以下操作...根据表格模型类创建二维表格 table_search = new JTable(model); new SearchResult().setVisible(true); }} //当选中是作者或者是书名单选按钮执行以下操作...Radio_author.isSelected()){ int m=0; do{ if(m<=n){ book_search =(Book)obo.readObject();//先读取第一个对象 // 如果文本框输入文字出现在某个对象执行以下操作...=null);} //当没有检索到书时候显示结果 if(!exist){ JLabel label_result = new JLabel("没有检索到该书!!")

    1.2K20

    Java入门(12)-- Swing程序设计

    JDialog窗体功能是从一个窗体中弹出另一个窗体,就像是使用IE浏览器弹出的确定对话框一样。...创建图标 Swing通过Icon接口来创建图标,可以创建给定图标的大小、颜色等特性。...: 12.4 常用布局管理器 12.4.1 绝对布局 绝对布局,就是硬性指定组件容器位置和大小,可以使用绝对坐标的方式来指定组件位置。...注:设置网格组每一行和每一列对额外空间分布方式,建议只设置第一行weightx属性和第一列weighty属性,建议为各个属性按百分比取值。...: 12.9 常用事件监听器 12.9.1 动作事件监听器 事件名称:ActionEvent 事件源:JButton、JList、JTextField等 监听接口:ActionListener 添加或删除相应类型监听器方法

    5.4K10

    JAVA学习Swing部分JDialog对话框窗体简单学习

    ; import javax.swing.WindowConstants; /**  * 1:JDialog窗体Swing组件对话框,  * JDialog功能就是是从一个窗体中弹出另一个窗体...,就像是使用浏览器弹出的确定对话框一样  *  * 2:JDialog窗体和JFrame窗体类似,使用时也需要调用getContentPane()方法将  * 窗体转化为容器,然后容器设置窗体特性...                new JDialogTest().setVisible(true);;             }         });         container.add(jb);//将按钮添加到容器...        jl.setHorizontalAlignment(JLabel.CENTER);//将标签文字置于标签中间位置         container.add(jl);//将标签添加到容器...();//创建一个容器         container.add(new JLabel("这是一个对话框"));//容器添加标签         container.setBackground(Color.green

    1.8K70

    Java常用事件监听器与实例分析

    我们知道Java窗体组件,本身是不具备任何功能,因此我们必须要给控件添加相应事件监听,才能在界面触发相应事件处理,今天就来和大家分享一下Java中常用几个事件监听器。...: 事件名称 事件源 监听接口 添加或删除相应类型监听器方法 ActionEvent JButton、JList、JTextField ActionListener addActionListener...在对某一个控件进行动作事件监听时候,一定要使用addActionListener()方法为该控件添加事件监听,否则就算对该控件写了触发事件,没有为该控件添加监听,单击该控件也还是没有用。...一般情况下,为事件源做监听事件应使用匿名内部类形式,如上例代码为按钮添加事件采用匿名内部类形式 焦点事件监听器 焦点事件(FocusEvent)监听器实际使用同动作事件监听器使用一样广泛...使用焦点事件监听器,需要注意以下几点: 使用该监听器需要实现FocusListener接口 该接口中重写focusLost()方法是组件失去焦点时调用

    2.6K10

    Java事件处理基础实例:处理按钮点击+捕获窗口事件+改变观感

    另一方面,如果使用像原始C这样语言进行事件驱动程序设计,就需要编写代码来不断地检查事件队列,以便查询操作环境报告内容。(通常这些代码被放置包含很多switch语句循环)。...在这个例子,我们想要 • 一个面板中放置三个按钮。 • 添加三个监听器对象用来作为按钮动作监听器。...下面是两个例子: 将按钮添加到面板需要调用add方法(十分容易记忆)。add方法参数指定了将要放置到容器组件。例如, 图8-2显示了结果。...事件属性由一个或多个用逗号分隔属性名组成。第一个属性从监听器方法参数读出。 第二个属性由结果对象读出等等。最后结果将作为动作参数。...当程序用户试图关闭一个框架窗口,JFrame对象就是WindowEvent事件源。WindowListener接口中包含7个方法。当发生窗口事件,框架将调用这些方法来响应7个不同事件。

    3.6K30

    java课程设计(简易计算器)源代码 JAVA 源代码有解析 免费分享

    ③单击计算器上函数按钮可以计算出相应函数值。 ④单击计算器上等号(=)按钮显示计算结果。 ⑤一个文本框显示当前计算过程,一个文本区显示以往计算过程。...⑥单击“保存”按钮可以将文本区显示全部计算过程保存到文件:单击“复制”按钮可以将文本区中选中文本复制到剪贴板单击“清除”技钮可以清除文本区全部内容。 注意事项: 一....OperateNumber.java 负责用户点击数字(0-9)按钮事件处理。 OperateSymbol.java 负责用户点击(+,-,*,/)按钮事件处理。...OperateBack.java 负责用户点击(退格)按钮事件处理。 OperatClear.java 负责用户点击(归零)按钮事件处理。...OperateZhengFu.java 负责用户点击(+/-)按钮事件处理。 OperateSin.java.java 负责用户点击(Sin)按钮事件处理。 三:涉及知识点 12.

    3.2K40
    领券