如何使用JButton“如果按下并释放”

时间:2016-03-30 15:51:15

标签: java swing button actionevent

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

我尝试了什么?我最初尝试使用JButton,它没有产生我想要的结果,因为形式我的理解JButton需要一个完整的“点击”我一直在玩JToggleButton 如果(JToggButton.getModel()。isPressed())仍然无效,有人可以指出我正确的方向产生所需的结果吗?

具体目标:

我想使用我制作的麦克风方法,我会点击说明麦克风的按钮,我会按住点击直到我准备完成对麦克风说话,想到Facebook如何按住麦克风用你的拇指和释放它时录音停止,所以有两种方法startLogic();当按下并按住并停止时();当用户完成发言时最终发布

1 个答案:

答案 0 :(得分:6)

请注意,一个简单但错误的解决方案是使用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();
            }
        });
    }
}