在JButton上右键点击

18

我想写一个Java扫雷克隆版来娱乐。 我有一个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");
            }
        }
    }
});

这似乎完全没有起作用,只显示了“X”部分,而没有显示“F”。但更重要的是,这对按下按钮没有任何作用。

编辑:在Mac上,弹出窗口触发事件发生在鼠标按下时,而不是鼠标单击时。

编辑:基于已接受答案,这是我制定的解决方案:

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);

扫雷克隆版 http://grab.by/1y9z


是的,我意识到最终的板子不应该显示所有这些数字。我只是在开发中。 - I82Much
你需要这个 popupTrigger 是干嘛的?只需检查鼠标按下事件并检查事件的修饰符是否为 BUTTON1_MASK 或 BUTTON2_MASK。 - Carl Smotricz
8个回答

5

mousePressed:

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

mouseReleased:

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

或者在那里做任何想做的事情。

今晚我会尝试这个,看起来最有前途。 - I82Much
1
为了使视觉提示正常工作,需要在调用setPressed()之前调用setArmed()。 - I82Much

5

我不会使用isPopupTrigger,而是直接检查正确的按钮:

button.addMouseListener(new MouseAdapter(){
  public void mouseClicked(MouseEvent e){
    boolean mine = field.isMine(x, y);
    // 检查鼠标事件是否为中间按钮
    if (e.getButton() == MouseEvent.BUTTON2) {
      button.setText("F");
    }
  ...

2

只是一个小的补充:检查正确的按钮最简单的方法是使用 SwingUtilities.isRightMouseButton


这个在Mac上的ctrl+click通常会触发右键点击,因此不能正常工作。 - I82Much

1

MouseEvent有一些属性

static int BUTTON1
static int BUTTON2
static int BUTTON3

等等其他的。当您的事件触发时,请检查这些。

编辑

public int getButton()

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

谢谢,我可以知道哪个按钮被按下了,但那不再是我的问题了。 - I82Much

1

如您所述,检查“mousePressed”解决了您的问题。而 isPopupTrigger 的 Javadoc 将解释其必要性:

public boolean isPopupTrigger()
...
注意:弹出式菜单在不同系统上的触发方式不同。因此,为了实现跨平台功能,应在 mousePressed 和 mouseReleased 两个事件中都检查 isPopupTrigger。

还请参阅 Java Swing 教程中关于鼠标监听器 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 上何时被触发。


0

右键点击时按钮被明显按下并不是按钮的“正常”行为。您可以尝试使用JToggleButton来模拟它,或者在右键按下时更改按钮的背景颜色和边框。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接