繁体   English   中英

如何在不使用“在范围内定义的局部变量x必须是最终的…”的情况下使用数组索引

[英]How to use array index without “Local variable x defined in an enclosing scope must be final…”

我正在编写一个简单的程序,但是有一个我无法解决的问题。

我正在使用这样的循环创建textFields:

 testText = new JTextField[9][9];
    for(int x = 0; x < 9; x++)
        for(int y = 0; y < 9; y++)
        {
            testText[x][y] = new JTextField();
            testText[x][y].setPreferredSize(new Dimension(30, 30));
            testText[x][y].setHorizontalAlignment(SwingConstants.CENTER);
            testText[x][y].setFont(new Font("Tahoma", Font.BOLD, 18));  
            testText[x][y].setBackground(Color.WHITE);
            testText[x][y].setEditable(false);
            testText[x][y].addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if( //blablabla )                       
                    testText[x][y].setText(value + "");
                }
            });
            panelMain.add(testText[x][y]);
        }

我想使用x和y来获取“单击”字段的位置,但神秘的错误说法是:“在封闭范围内定义的局部变量x必须是最终的或有效地是最终的”(与“ y”相同)

在我的项目中,将有检查功能,如果我可以将x和y用作参数,那将是一件很棒的事情:

         checkIfPossibel(x,y,value); // "value" is global

请记住,我不是Java的上帝,如果可能的话,我希望将这项工作保持在(对我来说)可理解的水平上。

最好的解决方法是简化您的代码-通过引入可以为final的局部变量(从而允许您在匿名内部类中使用它)来消除所有testTest[x][y]的重复:

testText = new JTextField[9][9];
for (int x = 0; x < 9; x++) {
    for (int y = 0; y < 9; y++)
    {
        final JTextField field = new JTextField();
        testText[x][y] = field;
        field.setPreferredSize(new Dimension(30, 30));
        field.setHorizontalAlignment(SwingConstants.CENTER);
        field.setFont(new Font("Tahoma", Font.BOLD, 18));  
        field.setBackground(Color.WHITE);
        field.setEditable(false);
        field.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (//blablabla) {                       
                    field.setText(value + "");
                }
            }
        });
        panelMain.add(field);
    }
}

目前尚不清楚您是否甚至需要testText ,但目前我假设您其他地方引用它。

首先,您需要了解为什么编译器告诉您它无法访问非最终xy 创建new MouseAdapter() ,需要为匿名类的构造函数“捕获”变量xy 创建对象 ,非最终xy值可能会发生变化,这可能会引起混淆,因为您在mouseClicked方法的内部和外部观察到的xy的值可能不同。 这就是Java语言设计人员要求匿名方法实现中只能使用final局部变量的原因。

现在您了解了所发生的情况,解决此问题很简单:制作xy final副本,并改用它们:

final int tmpX = x;
final int tmpY = x;
testText[x][y].addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        if( //blablabla )                       
        testText[tmpX][tmpY].setText(value + "");
    }
});

创建一个临时的最终变量,如下所示:

        testText[x][y].addMouseListener(new MouseAdapter() {
        final int x1 = x;
        final int y1 = y;
            @Override
            public void mouseClicked(MouseEvent e) {
                if( //blablabla )                       
                testText[x1][y1].setText(value + "");
            }
        });

伙计们,这是我在这里的第一篇文章,我很震惊。 您超快。 但是它不起作用,因为它支持。

为了找出答案,我做了类似的事情:

           final int tmpX = x;
            final int tmpY = x;
            Liczba[x][y].addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    pole =javax.swing.JTextField)e.getSource());
                    pole.setText(tmpX + " " + tmpY);                        

                }
            });

并设置行数,例如:对于0,其“ 0 0”,对于6,“ 6 6”,依此类推。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM