首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >actionListener on jcheckbox

actionListener on jcheckbox
EN

Stack Overflow用户
提问于 2012-09-26 17:28:42
回答 3查看 541关注 0票数 0

我正在尝试向JCheckBox添加一个匿名actionListener,但是在访问我想要用来更新值的对象时遇到了一些困难。我一直收到关于非final的错误,然后当我将它们更改为final时,它会抱怨其他事情。

我尝试做的事情如下(我删除了一些gui代码以使其更容易阅读):

代码语言:javascript
复制
for (FunctionDataObject fdo : wdo.getFunctionDataList())
{
    JLabel inputTypesLabel = new JLabel("Input Types: ");
    inputsBox.add(inputTypesLabel);
    for (int i = 0; i < fdo.getNumberOfInputs(); i++)
    {
        JLabel inputLabel = new JLabel(fdo.getInputNames().get(i));
        JComboBox inputTypeComboBox = new JComboBox(getTypes());
        inputTypeComboBox.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) 
             {
                 fdo.getInputTypes().set(i, (String) inputTypeComboBox.getSelectedItem());
             }
        });
     }
}    
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-26 17:31:41

您不能访问匿名类中的非final变量。你可以稍微修改一下你的代码来绕过这个限制(我已经完成了fdoinputTypeComboBox的最终版本,我也完成了i的最终版本):

代码语言:javascript
复制
    for (final FunctionDataObject fdo : wdo.getFunctionDataList()) {
        JLabel inputTypesLabel = new JLabel("Input Types: ");
        inputsBox.add(inputTypesLabel);
        for (int i = 0; i < fdo.getNumberOfInputs(); i++) {
            final int final_i = i;
            JLabel inputLabel = new JLabel(fdo.getInputNames().get(i));
            final JComboBox inputTypeComboBox = new JComboBox(getTypes());
            inputTypeComboBox.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    fdo.getInputTypes().set(final_i, (String) inputTypeComboBox.getSelectedItem());
                }
            });
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2012-09-26 17:30:23

从更新您的代码

代码语言:javascript
复制
 inputTypeComboBox.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) 
         {
             fdo.getInputTypes().set(i, (String) inputTypeComboBox.getSelectedItem());
         }
    });

代码语言:javascript
复制
final counter = i;
final JComboBox inputTypeComboBox = new JComboBox(getTypes());
final FunctionDataObject finalFDO = fdo;
inputTypeComboBox.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) 
         {
             finalFDO.getInputTypes().set(counter, (String) inputTypeComboBox.getSelectedItem());
         }
    });

This链接解释了为什么只能访问内部类中的最终变量

票数 1
EN

Stack Overflow用户

发布于 2012-09-26 17:33:03

这将会起作用:

代码语言:javascript
复制
    for (final FunctionDataObject fdo : wdo.getFunctionDataList()) {
        JLabel inputTypesLabel = new JLabel("Input Types: ");
        inputsBox.add(inputTypesLabel);
        for (int i = 0; i < fdo.getNumberOfInputs(); i++) {
            JLabel inputLabel = new JLabel(fdo.getInputNames().get(i));
            final JComboBox inputTypeComboBox = new JComboBox(getTypes());
            final int index = i;
            inputTypeComboBox.addActionListener(new ActionListener() {
                 public void actionPerformed(ActionEvent e) {
                     fdo.getInputTypes().set(index, (String) inputTypeComboBox.getSelectedItem());
                 }
            });
         }
    }    
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12598607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档