2010-01-05 302 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