【问题标题】:Don't click until button is released在释放按钮之前不要单击
【发布时间】:2013-04-09 22:47:45
【问题描述】:

您好,我现在正在制作一个简单的游戏,当您在播放屏幕上时,您可以按 esc 打开菜单。有一个主菜单按钮可将您从播放屏幕带到主菜单屏幕,问题是它会将它们带到主菜单屏幕,然后单击与游戏相同的主屏幕上的按钮菜单,因此它会在您释放按钮之前单击主菜单上的按钮。这是我的一些课程

这是我的菜单类(主屏幕)http://pastebin.com/kc5Dx2bp

这是我的游戏课(游戏画面)http://pastebin.com/Gr3y9Amj

有没有办法让它在释放鼠标按钮之前不能点击另一个按钮?

【问题讨论】:

  • 请发一个 SSCEE (sscce.org) 来帮助你的助手,因为这样帮助你就简单多了。

标签: java button lwjgl slick


【解决方案1】:

基本上,您可以使用ButtonModel 跟踪按钮状态的更精细更改,然后ActionListener 为您提供。

此示例监控模型的armedpressed 状态,并根据特定条件采取行动。

这是一个小技巧,因为您正在寻找的状态不仅会在释放按钮时出现,而且会在第一次按下按钮时出现。我们所做的是等到之前的状态按下按钮并且按钮pressed 状态为false,然后我们知道我们有一个按钮释放

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class TestButton05 {

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

    public TestButton05() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                final JButton btn = new JButton("Clicked");
                btn.getModel().addChangeListener(new ChangeListener() {
                    private boolean wasPressed = false;
                    @Override
                    public void stateChanged(ChangeEvent e) {
                        ButtonModel model = (ButtonModel) e.getSource();
                        if (model.isArmed() && !model.isPressed() && wasPressed) {
                            System.out.println("Released");
                        } else {
                            wasPressed = model.isPressed();
                        }
                    }
                });

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                frame.add(btn);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

【讨论】:

  • 我正在使用名为 slick 2d 和 lwjgl 的游戏库。我正在使用 if 语句来检查鼠标位置是否在打印按钮图像的区域内(使用像素坐标)以及鼠标按钮是否按下。我将如何检查鼠标按钮是否向上,以便在从第一个 if 语句释放鼠标按钮之前不会触发其他 if 语句。
  • 您可以在等效的鼠标处理程序中设置一个标志,以触发鼠标向下/向上事件
  • 对不起,我不是 java 专家,你说的 flag 是什么意思?
  • 一个 boolean 变量,您可以根据某些条件更改其状态(例如,当鼠标按下时,您可以将其设置为 true 并在需要时在代码中的其他位置检查它)
  • 哦。这是我的代码上的按钮示例: if((mousePosX>=300 && mousePosX =285&&mousePosY
【解决方案2】:
  1. 在您的类中创建一个名为 canClick 的布尔值。
  2. 创建一个 MouseListener。
  3. 为每个按钮添加 MouseListener (button.addMouseListener(...);)
  4. 在 MouseListener 中,实现所有需要的方法。
  5. 根据需要在每个方法中将布尔值设置为 true 或 false。
  6. 单击按钮时 (ActionListener),检查布尔值。
  7. 如果为 false,则取消它(或在为 true 之前禁用所有按钮)

类似的东西。

【讨论】:

  • 恕我直言-按钮上的MouseListeners 很少是一个好主意。我承认可能需要它的边缘情况可能很少,但我会先用尽所有其他选择 - 但这只是我
猜你喜欢
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多