如何使用 JButton "If pressed and if released"
How To Use JButton "If pressed and if released"
我希望使用 JButton 代替我的 Keylistener。按键侦听器有一些方法,例如是否按下或释放等。我想用这个 JButton 做同样的事情,Exp:如果用户用鼠标单击并将鼠标保持在单击的位置,代码将执行直到 s/he 释放按钮执行的代码将停止。
我试过什么?我一开始尝试使用 JButton,但没有产生我想要的结果,因为根据我的理解,JButton 需要一个完整的 "click" 我一直在玩 JToggleButton
如果 (JToggButton.getModel().isPressed()) 仍然无法正常工作,有人可以指出正确的方向以产生所需的结果吗?
具体目标:
我想使用我构建的麦克风方法,我会点击显示麦克风的按钮,然后按住点击直到我准备好完成对着麦克风说话,想想 Facebook 你是如何按住的用你的拇指按下麦克风,当你松开它时,录音就会停止,所以会有 2 种方法 startLogic();当按下并按住 stopLogic() 时;当用户说完最终释放时
请注意,一个简单但错误的解决方案是使用 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();
}
});
}
}
我希望使用 JButton 代替我的 Keylistener。按键侦听器有一些方法,例如是否按下或释放等。我想用这个 JButton 做同样的事情,Exp:如果用户用鼠标单击并将鼠标保持在单击的位置,代码将执行直到 s/he 释放按钮执行的代码将停止。
我试过什么?我一开始尝试使用 JButton,但没有产生我想要的结果,因为根据我的理解,JButton 需要一个完整的 "click" 我一直在玩 JToggleButton 如果 (JToggButton.getModel().isPressed()) 仍然无法正常工作,有人可以指出正确的方向以产生所需的结果吗?
具体目标:
我想使用我构建的麦克风方法,我会点击显示麦克风的按钮,然后按住点击直到我准备好完成对着麦克风说话,想想 Facebook 你是如何按住的用你的拇指按下麦克风,当你松开它时,录音就会停止,所以会有 2 种方法 startLogic();当按下并按住 stopLogic() 时;当用户说完最终释放时
请注意,一个简单但错误的解决方案是使用 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();
}
});
}
}