一个接一个地设置变量

时间:2013-12-08 20:21:02

标签: java swing

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

LockScreen类

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);
}
}

LockButton类

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

public class lockButton extends JButton
{
int lockID1;
String L11, L21, L31, L41;

public lockButton(int lockID, String L1, String L2, String L3, String L4)
{
    lockID1 = lockID;

    L1 = L11;
    L2 = L21;
    L3 = L31;
    L4 = L41;

    setText("" + lockID1);

    addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            if(L11 == null)
            {
                L11 = getText();
            }
            else
            {
                L21 = getText();
            }

            System.out.println("Btn Txt: " + getText());
            System.out.println("L1: " + L11 + " L2: " + L21 + " L3: " + L31 + " L4: " + L41);
        }
    });
}

public void setL1()
{
    L11 = getText();
}
}

1 个答案:

答案 0 :(得分:1)

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

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。 LockScreen类还有4个。总共有40个变量,所有变量都可以单独设置。他们没有联系。

我建议将4个变量分组到容器对象中,然后您可以将引用传递给单个共享容器对象,设置其变量并使变更在任何地方都可见。

可以使用数组。此外,如果这些是数字,它们实际上是int,而不是字符串。所以在LockScreen课程中你会有类似的东西:

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));
        }
    });
}