2013-12-08 180 views
0

我正在尝试创建一个锁屏界面。我有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(); 
} 
} 
+0

“输出显示,L11是在每次按下按钮时”是的,因为这正是你已经编程做它。如果这不是你想要的,你想要什么? – Boann

+0

我希望它继续设置下一个。这是为什么即时检查L11是否为空?因此,如果L11为空,则将其设置为getText(),如果它不为空并设置L21。 –

回答

1

我觉得这些任务都是围绕错误的方式:

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

应该是:

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

否则,它们将字段留空,并且还将(未使用的)参数设置为空。

此外,我不确定你的意图,但我猜你的字段在名称末尾有一个额外的'1'是因为你可以区分它们与参数变量。你不需要这样做。你可以给他们同样的名称,然后用this关键字来引用的字段:

this.L1 = L1; 

编辑:看代码的休息后,我认为你是一个有点困惑的引用是如何工作的。每个按钮都有自己的L11,L21,L31,L41。类LockScreen中还有4个。这总共是40个变量,并且它们都可以单独设置。他们没有连接。

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

一个数组可以用于此。此外,如果这些是数字,他们真的打算是整数,而不是字符串。所以,在课堂上的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)); 
     } 
    }); 
} 
+0

只需切换它们,每次只设置L11 –

+0

那么这个.L1与我设置的L11有关吗?即如果我将L11更改为L1? –

+0

@ChrisWalker this.L1'引用一个名为L1的字段(一个在类本身声明的变量)。使用'this'将它与方法内的同名变量或参数区分开来。另外,请参阅编辑的答案,看看它是否有帮助 – Boann