2010-01-05 103 views
14

我正在嘗試在Java中編寫掃雷克隆以獲得樂趣。我有一個JButtons的網格,其標籤我將改變以表示危險計數,標誌等。右鍵點擊JButton

我的問題是,我不知道如何在JButton上按右鍵來按下按鈕。我做了以下幾點:

button.addMouseListener(new MouseAdapter(){ 
    public void mouseClicked(MouseEvent e){ 
     boolean mine = field.isMine(x, y); 
     if (e.isPopupTrigger()) { 
      button.setText("F"); 
     } 
     else { 
      if (mine) { 
       button.setText("X"); 
      } 
     } 
    } 
}); 

這似乎並沒有工作; 「F」從不顯示,只顯示「X」部分。但更重要的是,這對壓低按鈕沒有任何作用。

編輯:Macs彈出式觸發器發生在mousePress上,而不是mouseClick。

編輯:這是我的工作了基於關閉接受的答案的解決方案:

button.addMouseListener(new MouseAdapter(){ 
      boolean pressed; 

      @Override 
      public void mousePressed(MouseEvent e) { 
       button.getModel().setArmed(true); 
       button.getModel().setPressed(true); 
       pressed = true; 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       //if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true)); 
       button.getModel().setArmed(false); 
       button.getModel().setPressed(false); 

       if (pressed) { 
        if (SwingUtilities.isRightMouseButton(e)) { 
         button.setText("F"); 
        } 
        else { 
         button.setText("X"); 
        } 
       } 
       pressed = false; 

      } 

      @Override 
      public void mouseExited(MouseEvent e) { 
       pressed = false; 
      } 

      @Override 
      public void mouseEntered(MouseEvent e) { 
       pressed = true; 
      }      
     }); 
     add(button); 

Minesweeper clone http://grab.by/1y9z

+0

是的,我知道最終的板子不應該有所有這些顯示的數字。我只是在發展。 – I82Much 2010-01-05 13:14:35

+0

你需要這個'popupTrigger'的東西?只需檢查mousePressed事件並檢查BUTTON1_MASK或BUTTON2_MASK的事件修飾符。 – 2010-01-05 13:18:28

回答

5

右鍵無法按下按鈕。這樣的行添加到您的鼠標監聽

的mousePressed:

if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true)); 

的mouseReleased:

if(needReset) {underlyingButton.getModel().setPressed(false)); 

或做任何有想。

+0

今晚我會試試這個;看起來最有希望。 – I82Much 2010-01-05 19:34:06

+1

爲了使視覺線索正常工作,需要在setPressed()之前調用setArmed() – I82Much 2010-01-06 02:20:58

1

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/MouseEvent.html

的MouseEvent有一些屬性

static int BUTTON1 
static int BUTTON2 
static int BUTTON3 

等等。檢查事件何時啓動。

編輯

公衆詮釋getButton()

Returns which, if any, of the mouse buttons has changed state. 
+0

謝謝,我可以得到哪個按鈕被按下,但這不再是我的問題。 – I82Much 2010-01-06 01:43:55

0

該按鈕是上點擊右鍵明顯鬱悶的是不是按鈕的 「正常」 行爲的一部分。您可以使用JToggleButton來僞造它,或者在按住鼠標右鍵的同時更改按鈕的背景顏色和邊界。

4

我不會用isPopupTrigger而是直接檢查右側的按鈕:

button.addMouseListener(new MouseAdapter(){ 
    public void mouseClicked(MouseEvent e){ 
    boolean mine = field.isMine(x, y); 
    if (e.getButton() == MouseEvent.BUTTON2) { 
     button.setText("F"); 
    } 
    ... 
1

正如您所提到的,檢查「mousePressed」解決了您的問題。和isPopupTrigger的Javadoc將解釋這方面的需要:

公共布爾的isPopupTrigger()
...
注:彈出菜單在不同的系統不同的觸發。因此,應該在mousePressed和mouseReleased中檢查isPopupTrigger以獲得正確的跨平臺功能。

另請參閱的章節關於Java Swing教程中的Mouse Listener API

0

這個罰款對我的作品在Mac上:

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

public class ButtonTest extends JFrame { 

    JButton button; 

    public ButtonTest() { 
     button = new JButton("W"); 
     button.addMouseListener(new MouseAdapter() { 
      public void mouseClicked(MouseEvent e) { 
       if (e.getButton() == 3) { // if right click 
        button.setText("F"); 
        button.getModel().setPressed(false); 
        // button.setEnabled(true); 
       } else { 
        button.setText("X"); 
        button.getModel().setPressed(true); 
        // button.setEnabled(false); 
       } 
      } 
     }); 
     this.add(button); 
     this.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new ButtonTest(); 
    } 

} 

你不妨檢查e.getButton()== 2,但是當這一次被觸發在Mac上,我不知道。

2

只是一個小加法:最簡單的方法檢查右邊的按鈕是SwingUtilities.isRightMouseButton

+0

這不適用於ctrl +單擊mac,通常會觸發右鍵單擊。 – I82Much 2010-01-06 01:40:23