【发布时间】:2019-07-03 11:42:33
【问题描述】:
今天,我遇到了一个奇怪的(对我来说)行为,我检查了它。我确实阅读了一堆关于方法引用和 lambda 之间区别的主题,但我无法将它与我的示例联系起来。考虑以下类:
public class TestFrame extends JFrame {
private static final long serialVersionUID = 1L;
private JComboBox<String> comboBox;
public TestFrame() {
super("test");
setLayout(new FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
comboBox = new JComboBox<>(new String[] { "hello", "world", "hi", "stack", "overflow" });
comboBox.addActionListener(event -> {
new ChangedIndexEvent(comboBox.getSelectedIndex()).printSelectedIndex(event);
});
add(comboBox);
setLocationRelativeTo(null);
setSize(200, 200);
setVisible(true);
}
private class ChangedIndexEvent {
private int index;
public ChangedIndexEvent(int index) {
this.index = index;
}
private void printSelectedIndex(ActionEvent event) {
System.out.println("Index: " + index);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(TestFrame::new);
}
}
当您运行它并使用组合框进行一些操作时,您将获得“正常”输出,例如:
索引:3 索引:1 索引:4 索引:0
但是,如果我改变了使用方法引用添加侦听器的方式:
comboBox.addActionListener(new ChangedIndexEvent(comboBox.getSelectedIndex())::printSelectedIndex);
输出将是:
索引:0 索引:0 索引:0
我的问题是,为什么总是 0?
我的意思是,如果我 comboBox.setSelectedIndex(2); 它总是会返回 2 我猜它会返回“初始”值。但是方法引用不是和 lambda 表达式一样吗?
【问题讨论】:
标签: java swing lambda method-reference