gpt4 book ai didi

java - 从按钮/鼠标释放调用 Java AbstractAction

转载 作者:行者123 更新时间:2023-11-30 03:31:50 25 4
gpt4 key购买 nike

在一个简单的计算器应用程序中,我使用抽象操作来处理用鼠标单击的按钮以及按下的相应数字键盘键(带有键绑定(bind))。我希望在使用键盘时发生某些外观更改,例如当我按下数字 1 键时更改 JButton 数字 1 的边框。并在发布后将其更改回来。这一切都有效。然后我开始再次用鼠标按下 JButton,并意识到按键释放操作永远不会被调用,显然是因为我没有使用按键绑定(bind)。所以我的问题是,有没有办法在鼠标释放/按钮抬起时调用适当的释放抽象操作?

当我发现这一点时,我最初尝试了这个:

Abstract action(){
set border to this..
code..
code..
code..
set border to this..
}

所以无论是按键还是鼠标,它都会改变。然而它并没有改变,或者可能变化得太快以至于无法检测到。

在此实例中注册鼠标监听器没有意义。无论如何,我尝试了这个,但我似乎无法将抽象操作注册为鼠标监听器。

感谢您的意见和想法。

我注册 Action 监听器:

    btnMultiplication.addActionListener( operatorAction );
btnDivision.addActionListener( operatorAction );
btnAddition.addActionListener( operatorAction );
btnSubtraction.addActionListener( operatorAction );
btnSix.addActionListener( numberAction );
btnSeven.addActionListener( numberAction );
btnEight.addActionListener( numberAction );

*操作是抽象操作

我用它来进行键盘输入

im.put( KeyStroke.getKeyStroke( KeyEvent.VK_NUMPAD0, 0, false ), "Number" );
im.put( KeyStroke.getKeyStroke( KeyEvent.VK_NUMPAD0, 0, true ), "Number Released" );
am.put( "Number", numberAction );
am.put( "Number Released", numberActionR );

我使用数字操作来更改相应 jbutton 的边框。然后我使用Number Released再次更改边框。

显然,当我用鼠标单击时,边框会突出显示。但已发布的号码不会调用。就像我所说的,一起消除已发布的方面,并将第一个边界更改放在抽象操作的开头,然后将最终的边界更改放在抽象操作的末尾显然速度太快了,你看不到边界变化。

最佳答案

许多人在处理按键绑定(bind)时错过的一件事是,您可以注册“按下”或“释放”事件(按下是默认值)。所以就你的情况而言,你需要两者都做。 “按下”事件应该“装备”和“按下”按钮,“释放”事件应该“松开”和“取消装备”按钮(顺序很重要),例如......

我也会改变你的焦点。让 JButton Action 执行此操作,而不是让键绑定(bind)触发所需的操作,这将允许您专注于让键绑定(bind)更改按钮的状态,最好通过使用按钮模型,这将允许触发按钮并调用关联的 Action

Buttons

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import static javax.swing.Action.NAME;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

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

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

public class TestPane extends JPanel {

public TestPane() {
setLayout(new GridLayout(4, 3));
add(createButton(7, KeyEvent.VK_7, KeyEvent.VK_NUMPAD7));
add(createButton(8, KeyEvent.VK_8, KeyEvent.VK_NUMPAD8));
add(createButton(9, KeyEvent.VK_9, KeyEvent.VK_NUMPAD9));
add(createButton(4, KeyEvent.VK_4, KeyEvent.VK_NUMPAD4));
add(createButton(5, KeyEvent.VK_5, KeyEvent.VK_NUMPAD5));
add(createButton(6, KeyEvent.VK_6, KeyEvent.VK_NUMPAD6));
add(createButton(1, KeyEvent.VK_1, KeyEvent.VK_NUMPAD1));
add(createButton(2, KeyEvent.VK_2, KeyEvent.VK_NUMPAD2));
add(createButton(3, KeyEvent.VK_3, KeyEvent.VK_NUMPAD3));
add(createButton(0, KeyEvent.VK_0, KeyEvent.VK_NUMPAD0));
}

protected JButton createButton(int number, int... virtualKeys) {

NumberAction na = new NumberAction(Integer.toString(number));
JButton btn = new JButton(na);

InputMap im = btn.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap am = btn.getActionMap();

for (int virtualKey : virtualKeys) {

im.put(KeyStroke.getKeyStroke(virtualKey, 0, false), "number-pressed");
im.put(KeyStroke.getKeyStroke(virtualKey, 0, true), "number-released");

}

am.put("number-pressed", new NumberKeyPressedAction(btn, true));
am.put("number-released", new NumberKeyPressedAction(btn, false));

return btn;

}

public class NumberAction extends AbstractAction {

public NumberAction(String name) {
super(name);
}

@Override
public void actionPerformed(ActionEvent e) {
System.out.println(getValue(NAME) + " was clicked");
}

}

public class NumberKeyPressedAction extends AbstractAction {

private final JButton btn;
private final boolean pressed;

public NumberKeyPressedAction(JButton btn, boolean pressed) {
// You could just pass the button model, but this was easier...
this.btn = btn;
this.pressed = pressed;
}

@Override
public void actionPerformed(ActionEvent e) {
if (pressed) {
btn.getModel().setArmed(pressed);
btn.getModel().setPressed(pressed);
} else {
btn.getModel().setPressed(pressed);
btn.getModel().setArmed(pressed);
}
}

}

}

}

关于java - 从按钮/鼠标释放调用 Java AbstractAction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28843656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com