2013-12-08 132 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