簡體   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