2014-12-19 26 views
1

我有關於JButton的問題。我有一個20x20 JButton的GridLayout。當我點擊它時,我想獲得一個按鈕的價值。 (x.getText())。JButton不會返回正確的文本值

sout只打印右下角值,不管我點擊哪個按鈕。

如果我點擊左上方按鈕,它打印19.我想回去在這種情況下,該值爲0

enter image description here

下面我的代碼。

public class MainFrame extends Frame implements MouseListener{ 

JButton button; 

public MainFrame() { 

    setSize(new Dimension(1000, 1000)); 
    addComponents(); 

} 

private void addComponents(){ 

    JPanel mainPanel = new JPanel(new BorderLayout()); 

    JPanel top = new JPanel(new GridLayout(1,1)); 
    JPanel center = new JPanel(new GridLayout(20, 20)); 

    JLabel label = new JLabel("test"); 
    top.add(label); 

    for (int i = 0; i < 20; i ++){ 
     for (int j = 0; j < 20; j ++){ 
      button = new JButton(String.valueOf(i)); 
      button.addMouseListener(this); 
      center.add(button); 
     } 
    } 

    mainPanel.add(top, BorderLayout.NORTH); 
    mainPanel.add(center, BorderLayout.CENTER); 

    add(mainPanel); 

} 

@Override 
public void mouseClicked(MouseEvent e) { 

    System.out.println(button.getText()); 

} 
// Also implements multiple other methods from the interface, but irrelevant for my question. 

新代碼(工作代碼):

public class MainFrame extends Frame { 

public MainFrame() { 

    setSize(new Dimension(1000, 1000)); 
    addComponents(); 

} 



private void addComponents(){ 

    JPanel mainPanel = new JPanel(new BorderLayout()); 

    JPanel top = new JPanel(new GridLayout(1,1)); 
    JPanel center = new JPanel(new GridLayout(20, 20)); 

    JLabel label = new JLabel("test"); 
    top.add(label); 

    ActionListener listener = new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      String text = e.getActionCommand(); 
      System.out.println(text); 
     } 
    }; 


    for (int i = 0; i < 20; i ++){ 
     for (int j = 0; j < 20; j ++){ 
      JButton button = new JButton(String.valueOf(i)); 
      button.addActionListener(listener); 
      center.add(button); 
     } 
    } 

    mainPanel.add(top, BorderLayout.NORTH); 
    mainPanel.add(center, BorderLayout.CENTER); 

    add(mainPanel); 

回答

6

不要在JButton上使用MouseListener,因爲通過這樣做,如果按鈕具有焦點,則按鈕不會響應空格鍵按鈕,而且如果禁用該按鈕,則MouseListener仍然可以正常工作,這是不正確的行爲。

取而代之,使用ActionListener,只需一個ActionListener,一個添加到每個按鈕,並從ActionEvent參數獲取操作命令。 >`爲(INT - `並通過使用循環,可以聲明每個按鈕;

ActionListener actionListener = new ActionListener() { 

    public void actionPerformed(ActionEvent e) { 
     String text = e.getActionCommand(); 
    } 

} 

// add listener to all buttons in a for loop 
+0

1 +對於使用單個偵聽器,但是操作命令稍後可能與顯示的文本不同,所以您應該如@ dic19在他的評論中所說的那樣做? – Dici

0

您必須聲明按鈕的數組,然後循環它宣佈的所有按鈕,並在你的代碼中添加的動作偵聽器

+0

請用代碼示例 – foxygen

+0

'JButton的[] []按鈕=新的JButton [20] [20]補充你的答案i = 0; i Sam

4

看,您只有一個屬性button,該值將打印在您的mouseClicked方法中,因此這裏沒有什麼值得注意的。

每個按鈕都必須有自己的監聽器,所以刪除您的屬性,並使用此代碼:

for (int i = 0; i < 20; i ++){ 
    for (int j = 0; j < 20; j ++){ 
     final JButton button = new JButton(String.valueOf(i)); 
     button.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       System.out.println(button.getText()); 
      } 
     }); 
     center.add(button); 
    } 
} 

你也可以使用一個ActionListener而不是MouseAdapter的。

+0

1+但是... 1)不需要聲明'button'爲final。 2)將事件的源頭作爲'JButton'並將其打印出來,即:((JButton)e.getSource())。getText()'。 3)同意'ActionListener'。 – dic19

+1

1 ActionListener是所有需要的。 –

+1

@ dic19你知道爲什麼在匿名類的定義中使用局部變量時不再需要final嗎?我記得有幾次當我不得不這樣做時 – Dici