【问题标题】:How To Use JButton "If pressed and if released"如何使用 JButton“如果按下并释放”
【发布时间】:2016-03-30 15:51:14
【问题描述】:

我希望使用 JButton 来代替我的 Keylistener。键侦听器具有诸如如果释放时按下等方法。我希望对这个 JButton 做同样的事情,Exp:如果用户用鼠标单击并将鼠标保持在单击的位置,代码将执行,直到她/他释放执行的按钮代码将停止。

我尝试了什么?我最初尝试使用 JButton,但没有产生我想要的结果,因为从我的理解来看,JButton 需要完全“点击”我一直在玩 JToggleButton if (JToggButton.getModel().isPressed()) 仍然无法正常工作,有人可以指出正确的方向以产生所需的结果吗?

具体目标:

我想使用我构建的麦克风方法,我将单击显示麦克风的按钮,然后按住单击直到我准备好对麦克风讲话,想想 Facebook 是如何按住麦克风的用你的拇指,当你松开它时,录音就会停止,所以会有两种方法 startLogic();当按下并按住和 stopLogic();当用户说完最终释放时

【问题讨论】:

  • 您想要一个切换按钮。更好地描述您想要实现的目标,然后发布您的代码。
  • 尝试使用MouseListener
  • 一种方法:将 ChangeListener 添加到按钮的 ButtonModel。 @DistribuzioneGaussiana:请注意,如果通过非鼠标方式按下按钮,则 MouseListener 将不起作用,例如使用空格键
  • 我在上面添加了一个更具描述性的问题 ^

标签: java swing button actionevent


【解决方案1】:

请注意,一个简单但错误的解决方案是使用 MouseListener,这是错误的,因为此侦听器不响应按钮按下而是鼠标按下,如果通过鼠标以外的任何方式按下它,这将错过按钮按下,例如作为空格键。

我会使用 ChangeListener 监听按钮的 ButtonModel 并响应其 isPressed() 状态的变化。无论按什么按钮,无论是鼠标还是空格键,这都会起作用。例如:

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

@SuppressWarnings("serial")
public class ButtonPressTest extends JPanel {
    private JButton button = new JButton("Button");
    private JTextArea textArea = new JTextArea(15, 15);

    public ButtonPressTest() {
        button.getModel().addChangeListener(new BtnModelListener());
        textArea.setFocusable(false);
        add(button);
        add(new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
                                      JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED));
    }

    private class BtnModelListener implements ChangeListener {
        private boolean pressed = false;  // holds the last pressed state of the button

        @Override
        public void stateChanged(ChangeEvent e) {
            ButtonModel model = (ButtonModel) e.getSource();

            // if the current state differs from the previous state
            if (model.isPressed() != pressed) {
                String text = "Button pressed: " + model.isPressed() + "\n"; 
                textArea.append(text);
                pressed = model.isPressed();
            }
        }
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("ButtonPressTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new ButtonPressTest());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

【讨论】:

  • 不错的观察。大多数人会使用 MouseListener 来做到这一点。
  • 我认为这将最适合我的需求,1 + 用于您设置的方式,因为我也在考虑使用 mouslistener 但意识到它无法正常工作,我给你答案,虽然今天教我一些东西:)
猜你喜欢
  • 2010-09-15
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多