2013-12-07 157 views
1

我正在用Java寫一個GUI程序。 GUI包含9個按鈕,標題爲H.在運行模式下,當鼠標點擊任何按鈕時,該按鈕應將標題更改爲T.我有一個注意點擊的MouseListener代碼。但我無法根據鼠標點擊找出需要更改該特定按鈕的方法。任何幫助表示讚賞。
以下是我的代碼。Java中的翻轉硬幣

package flippingcoins; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class FlippingCoins extends JFrame 
{ 
    public FlippingCoins() 
    { 
     JPanel p = new JPanel(); 

     p.setLayout(new GridLayout(3,3,1,1)); 

     JButton jbt1=new JButton("H"); 
     p.add(jbt1); 
     JButton jbt2=new JButton("H"); 
     p.add(jbt2); 
     JButton jbt3=new JButton("H"); 
     p.add(jbt3); 
     JButton jbt4=new JButton("H"); 
     p.add(jbt4); 
     JButton jbt5=new JButton("H"); 
     p.add(jbt5); 
     JButton jbt6=new JButton("H"); 
     p.add(jbt6); 
     JButton jbt7=new JButton("H"); 
     p.add(jbt7); 
     JButton jbt8=new JButton("H"); 
     p.add(jbt8); 
     JButton jbt9=new JButton("H"); 
     p.add(jbt9); 
     add(p); 
    } 

    public static void main(String[] args) //Main program begins here. 
    { 
     FlippingCoins frame = new FlippingCoins();//Instantiating an object. 
     frame.setTitle("Head or Tails");//Setting the frame title. 
     frame.setSize(300,300);//Setting the size. 
     frame.setLocationRelativeTo(null);//Setting the location. 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// Default closing options. 
     frame.setVisible(true);//Setting visibility to true. 
    }//End of main program. 

    static class ChangeTiles extends JPanel 
    { 
     public ChangeTiles() 
     { 
     addMouseListener(new MouseAdapter()//Creating a listener 
     { 
      public void mouseClicked(MouseEvent e)//When the mouse is clicked. 
      { 
       int x=e.getX(); 
       int y=e.getY(); 
       System.out.println("x= "+ x + "y= "+y); 

      } 
     } 
         ); 
     } 
    } 

回答

1
public FlippingCoins() { 
    final JPanel p = new JPanel(); 

    p.setLayout(new GridLayout(3, 3, 1, 1)); 

    for (int i = 0; i < 9; i++) { 
     final JButton jbt = new JButton("H"); 
     jbt.setName("" + i); 
     jbt.addActionListener(new ActionListener() { 
      public void actionPerformed(final ActionEvent e) { 
       jbt.setText("T"); 
       System.out.println(jbt.getName()); 
      } 
     }); 
     p.add(jbt); 
    } 
    setContentPane(p); 
} 

一些注意事項:

  • 使用重複性任務
  • 聽衆必須添加到窗口小部件,他們應該聽
  • 沒有爲JButton使用MouseListener小號循環 ,有ActionListener

替代計劃JLabel

public FlippingCoins2() { 
    final JPanel p = new JPanel(); 

    p.setLayout(new GridLayout(3, 3, 1, 1)); 

    for (int i = 0; i < 9; i++) { 
     final JLabel jlb = new JLabel("H", SwingConstants.CENTER); 
     jlb.setBorder(BorderFactory.createLineBorder(Color.blue)); 
     jlb.setName("" + i); 
     jlb.addMouseListener(new MouseAdapter() { 

      public void mouseClicked(final MouseEvent e) { 
       jlb.setText("T"); 
       System.out.println(jlb.getName()); 
      } 
     }); 
     p.add(jlb); 
    } 
    setContentPane(p); 
} 
+0

如果我需要什麼樣的使用鼠標監聽器?我不需要使用jbutton。我也可以用劃分框架的線條來使用標籤。 – user2918968

+0

@ user2918968:我根據您的要求修改了示例。 –

+0

Jens Piegsa ...非常感謝您的幫助。它工作完美。 – user2918968

5

這不是一個好的策略。相反,將每個按鈕添加一個ActionListener。它不僅會容易得多,而且用戶還可以使用鍵盤來點擊按鈕。

此外,請考慮使用數組或按鈕列表。這將允許使用循環,而不是複製和粘貼相同的代碼9次。

0

這是你應該怎麼做:

JButton jbt1=new JButton("H"); 
jbt1.addActionListener(new ButtonListener()); 
//add ButtonListener to all of the other buttons 

//Somewhere in your code: 
public class ButtonListener extends ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     JButton source = (JButton) e.getSource(); 
     source.setText("T"); 
    } 
} 
0

這將是容易,如果你添加一個ActionListener。在actionPerformed代碼中,您可以打印出哪個按鈕被點擊。

getSource() 

Returns: The object on which the Event initially occurred. 

您可以對由ActionPerformed方法生成的ActionEvent調用getSource()。我沒有嘗試過,但聽起來像你可以很容易地找出哪個按鈕被點擊。

+0

不要忘了將它轉換爲一個JButton – MultiplyByZer0