如何从Java中的内部类中读取变量?

时间:2017-03-02 09:47:59

标签: java class final anonymous-inner-class

我设计了这个方法来显示一个带滑块的窗口,我需要返回该值。你能否告诉我如何检索JSlider值当前我得到错误:"从内部类引用的局部变量必须是最终的或有效的最终"?

private static int displayFontPanel(JFrame w){
    JFrame window = new JFrame("Font Settings");
    window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    int fontSize = 14;
    window.setSize(400, 200);
    window.setLocationRelativeTo(w);
    JSlider fntSize = new JSlider(8,40,20);
    fntSize.addChangeListener(new ChangeListener() {
        public void stateChanged(ChangeEvent evt) {
            fontSize = ((JSlider)evt.getSource()).getValue();
        }
    });
    fntSize.setLabelTable( fntSize.createStandardLabels(8) );
    fntSize.setPaintLabels(true);
    panel.add(fntSize, BorderLayout.CENTER);
    window.setContentPane(panel);
    window.setVisible(true);
    return fontSize;
} 

3 个答案:

答案 0 :(得分:0)

将方法签名更改为

((JSlider) evt.getSource()).getValue()

之后你就可以了

kubectl exec -it mypodname bash

这个答案比我更好地解释了为什么变量需要是最终的:https://stackoverflow.com/a/4732617/3061857

答案 1 :(得分:0)

代码错误是否真的涉及滑块,而不是fontSize?如果是后者,那么你必须“欺骗”系统一点。闭包中引用的变量必须是final,即 - 在以下代码中保持不变。

但如果你作弊一点,并将fontSize声明为数组(final int[] fontSize = new int[1])并修改其内容,那么一切都应该有效,如下:

fntSize.addChangeListener(new ChangeListener()   {
    public void stateChanged(ChangeEvent evt) {
        fontSize[0] = ((JSlider)evt.getSource()).getValue();
       }
    });

答案 2 :(得分:0)

我会使用AtomicInteger而不是int:

sed