Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个接一个地设置变量_Java_Swing - Fatal编程技术网

Java 一个接一个地设置变量

Java 一个接一个地设置变量,java,swing,Java,Swing,我正在尝试创建一个锁屏界面。我有4个字符串变量,分别称为L11、L21、L31和L41。在我的LockButton类中,我试图用ActionListener设置它们的值。我将第一个L11设置为按钮中的文本。通过检查L11!=空,我设置L21,依此类推。相反,输出显示每次按下按钮时都会设置L11,这不是我的意图 锁屏类 import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; import

我正在尝试创建一个锁屏界面。我有4个字符串变量,分别称为L11、L21、L31和L41。在我的LockButton类中,我试图用ActionListener设置它们的值。我将第一个L11设置为按钮中的文本。通过检查L11!=空,我设置L21,依此类推。相反,输出显示每次按下按钮时都会设置L11,这不是我的意图

锁屏类

import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class LockScreen
{
static int lockID;

static String L1, L2, L3, L4;


static JFrame frame;
static JPanel panel;
static JButton digits;
static GridLayout grid = new GridLayout(3,4);

public static void main(String [] args)
{
    frame = new JFrame("LockScreen");
    panel = new JPanel();

    for(int lockID = 1; lockID < 10; lockID++)
    {
        lockButton btn = new lockButton(lockID, L1, L2, L3, L4);
        panel.add(btn);
    }

    panel.setLayout(grid);

    frame.add(panel);
    frame.setSize(300,600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}
}

我认为这些作业是错误的:

L1 = L11;
L2 = L21;
L3 = L31;
L4 = L41;
应该是:

L11 = L1;
L21 = L2;
L31 = L3;
L41 = L4;
否则,它们会将字段保留为null,并将(未使用的)参数设置为null

另外,我不确定您的意图,但我猜您的字段在名称的末尾有一个额外的“1”的原因是,您可以将它们与参数变量区分开来。你不需要这样做。您可以为它们指定相同的名称,然后使用
this
关键字来引用字段:

this.L1 = L1;
编辑:在看过代码的其余部分后,我认为您对引用的工作方式有点困惑。每个按钮都有自己的L11、L21、L31、L41。课堂上还有4个锁屏。总共有40个变量,所有变量都可以单独设置。他们没有联系

我建议将这4个变量分组到一个容器对象中,然后您可以传递对单个共享容器对象的引用,设置其变量,并使更改随处可见

可以使用一个数组来执行此操作。此外,如果这些是数字,它们实际上是整数,而不是字符串。因此,在课堂上,你将有如下内容:

int[] codeDigits = new int[4];
java.util.Arrays.fill(codeDigits, -1); // using -1 to mark unset digits
然后在LockButton的构造函数中:

public LockButton(final int digit, final int[] codeDigits) {
    setText("" + digit);

    addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < codeDigits.length; i++) {
                // set next digit:
                if (codeDigits[i] == -1) {
                    codeDigits[i] = digit;
                    break;
                }
            }
            System.out.println(java.util.Arrays.toString(codeDigits));
        }
    });
}
public lock按钮(最终整数位数,最终整数[]码位数){
setText(“+”位);
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
对于(int i=0;i
“输出显示每次按下按钮时L11都被设置”是,因为这正是您编程的目的。如果这不是你想要的,你想要什么?我希望它继续设置下一个。这就是为什么我要检查L11是否为空?因此,如果L11为null,则将其设置为getText(),如果它不是null,则设置L21。只需切换它们,每次仍然只设置L11。因此,this.L1是否与L11 I集相关?i、 e如果我将L11更改为L1?@ChrisWalker
此.L1
引用名为L1的字段(在类本身上声明的变量)。使用
可将其与方法中具有相同名称的变量或参数区分开来。另外,请参阅编辑后的答案,并查看它是否有帮助
public LockButton(final int digit, final int[] codeDigits) {
    setText("" + digit);

    addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < codeDigits.length; i++) {
                // set next digit:
                if (codeDigits[i] == -1) {
                    codeDigits[i] = digit;
                    break;
                }
            }
            System.out.println(java.util.Arrays.toString(codeDigits));
        }
    });
}