右键单击 JButton

发布于 2024-08-17 04:57:25 字数 1891 浏览 3 评论 0原文

我正在尝试用 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");
            }
        }
    }
});

这似乎根本不起作用; “F”从未显示,仅显示“X”部分。但更重要的是,这对于按下按钮没有任何作用。

编辑:Mac 的弹出触发器发生在 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);

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

I am trying to write a Minesweeper clone in Java for fun. I have a grid of JButtons whose labels I will change to represent the danger count, flags, etc.

My problem is, I don't know how to get a right click on a JButton to depress the button. I've done the following:

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

This doesn't seem to be working at all; the "F" is never shown, only the "X" part. But more importantly, this does nothing for depressing the button.

EDIT: Macs have popup trigger happen on mousePress, not mouseClick.

EDIT: Here's the solution I worked out based off of accepted answer:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

情仇皆在手 2024-08-24 04:57:25

我不会使用 isPopupTrigger 而是直接检查右侧按钮:

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

I wouldn't use isPopupTrigger but directly check for the right button:

button.addMouseListener(new MouseAdapter(){
  public void mouseClicked(MouseEvent e){
    boolean mine = field.isMine(x, y);
    if (e.getButton() == MouseEvent.BUTTON2) {
      button.setText("F");
    }
  ...
明月夜 2024-08-24 04:57:25

右键无法按下按钮。将这样的行添加到鼠标侦听器

mousePressed:

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

mouseReleased:

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

或做任何想做的事情。

Button can't be pressed by right click. Add such a lines to you mouse listener

mousePressed:

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

mouseReleased:

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

or do there whatever want.

甜是你 2024-08-24 04:57:25

只是一个小补充:检查右键的最简单方法是 SwingUtilities.isRightMouseButton

Just a small addition: the simplest way to check for the right button is SwingUtilities.isRightMouseButton

彼岸花ソ最美的依靠 2024-08-24 04:57:25

正如您所提到的,检查“mousePressed”解决了您的问题。以及 的 Javadoc isPopupTrigger 会解释这样做的必要性:

public boolean isPopupTrigger()
...
注意:弹出菜单在不同系统上的触发方式不同。因此,应该在 mousePressed 和 mouseReleased 中检查 isPopupTrigger 以获得正确的跨平台功能。

另请参阅 Java Swing 教程。

As you have mentioned that checking for "mousePressed" solved your issue. And the Javadoc of isPopupTrigger would explain the need for this:

public boolean isPopupTrigger()
...
Note: Popup menus are triggered differently on different systems. Therefore, isPopupTrigger should be checked in both mousePressed and mouseReleased for proper cross-platform functionality.

Also see the section on The Mouse Listener API in the Java Swing tutorial.

掌心的温暖 2024-08-24 04:57:25

MouseEvent 有一些属性

static int BUTTON1
static int BUTTON2
static int BUTTON3

除其他外。当您的事件触发时检查这些。

编辑

公共 int getButton()

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

MouseEvent has some properties

static int BUTTON1
static int BUTTON2
static int BUTTON3

among others. Check those when your event fires.

EDIT

public int getButton()

Returns which, if any, of the mouse buttons has changed state. 
高冷爸爸 2024-08-24 04:57:25

右键单击时明显按下的按钮不属于按钮的“正常”行为。您可以使用 JToggleButton 来伪造它,或者在按住鼠标右键时简单地更改按钮的背景颜色和边框。

The button being visibly depressed on right click isn't part of the "normal" behavior of buttons. You may be able to fake it using JToggleButtons, or simply changing the button's background color and maybe border while the right mouse button is being held down.

涫野音 2024-08-24 04:57:25

如果您确定事件已正确触发(调试 FTW!)并且 button.setText("F") 正在发生,那么也许您只需要重新绘制。

重新绘制按钮。
http:// /java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)

If you are certain that the event is properly being triggered (debug FTW!) and that the button.setText("F") is happening, then perhaps you simply need to repaint.

Repaint the button.
http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)

一生独一 2024-08-24 04:57:25

这在 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 上何时触发此操作。

This works for me fine on 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();
    }

}

You might as well check for e.getButton() == 2 but I don't know when this one is triggered on Macs.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文