Java新手求助:如何通过按钮获取JComboBox选中的年月值
解决JComboBox选中值在按钮点击事件中无法访问的问题
你遇到的报错是因为monthSelected和annoSelected是定义在ComboBox监听方法内部的局部变量,作用域只限于那个方法,按钮的点击事件根本访问不到这些变量。
最简单的解决方式是直接在按钮点击事件中从ComboBox获取当前选中值,不需要提前把值存在局部变量里,修改后的代码如下:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.time.LocalDate; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.WindowConstants; public class ComboTest { ComboTest() { String[] monthName = {"Gennaio", "Febbraio", "Marzo"}; String[] yearName = {"2017", "2018", "2019"}; JFrame frame = new JFrame("All by myself"); JPanel panel = new JPanel(); LocalDate today = LocalDate.now(); String anno = String.valueOf(today.getYear()); int meseEn = today.getMonthValue(); String mese = monthName[meseEn - 1]; JComboBox<String> comboMese = new JComboBox<>(monthName); comboMese.setSelectedItem(mese); comboMese.setBounds(10, 15, 90, 18); // 保留ComboBox的实时打印监听(不需要可删除) comboMese.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String monthSelected = (String) comboMese.getSelectedItem(); System.out.println(monthSelected); } }); JComboBox<String> comboAnno = new JComboBox<>(yearName); comboAnno.setBounds(110, 15, 90, 20); comboAnno.setSelectedItem(anno); // 保留ComboBox的实时打印监听(不需要可删除) comboAnno.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String annoSelected = (String) comboAnno.getSelectedItem(); System.out.println(annoSelected); } }); JButton select = new JButton("select"); select.setBounds(220, 15, 80, 20); select.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Selected"); // 直接从ComboBox获取最新选中值 String monthSelected = (String) comboMese.getSelectedItem(); String annoSelected = (String) comboAnno.getSelectedItem(); System.out.println(monthSelected); System.out.println(annoSelected); // 在这里编写后续业务代码 } }); panel.setLayout(null); panel.add(comboMese); panel.add(comboAnno); panel.add(select); panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.add(panel); frame.setSize(350, 100); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { new ComboTest(); } }
关键说明:
- 匿名内部类(如按钮的ActionListener)可以访问构造方法中定义的变量(Java 8+会自动推断符合条件的变量为final),因此直接调用
comboMese.getSelectedItem()是可行的 - 直接从ComboBox获取值的方式更可靠,能确保拿到用户点击按钮前的最新选中项,避免局部变量保存的值过期
- 已删除代码中重复的
frame.setDefaultCloseOperation设置
内容的提问来源于stack exchange,提问作者user17565490
相关产品推荐
相关产品推荐

