- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在一个简单的计算器应用程序中,我使用抽象操作来处理用鼠标单击的按钮以及按下的相应数字键盘键(带有键绑定(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
。
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/
我想在运行时将一系列 Swing 操作加载到容器中,并通过常量名称访问它们,就像使用枚举一样。这样做的目的是限制可能的操作并提高可读性。 最初,我正在考虑一种动态枚举(请参阅 http://blog.
我的要求是添加两个图标到抽象操作示例:图标 + 操作名称 + 图标AbstractAction 有一个 super 构造函数来仅添加一个图标 最佳答案 通过将操作标签设置为 HTML 解决了此问题 关
我有一个 JMenuItem 绑定(bind)到一个 Action,我可以使用 item.getAction() 获取它。 Action 名称在构造 Action 时设置,例如使用匿名 new Abs
请原谅这个模糊的问题标题,但通常我不会做这样的事情。所以我有以下问题: 我正在为特定应用程序设计一个弹出菜单,其中每个菜单项都与特定操作相关联: public class CanvasMenu ext
我正在尝试使用子类 ColorAction 来扩展 AbstractAction 类。此类处理 ActionPerformed 方法的方法是获取用户的字符串格式输入,并将其与 colorKey 中的
这个问题在这里已经有了答案: event handling in java and the execution of actionPerformed method in java (5 个答案) 关
我试图通过使用 Action 对象将我的 GUI 应用程序中的功能与状态分开。我已经成功地使用它们来创建具有相同功能的菜单项和按钮。 我的问题是:我想对菜单中的“退出”项和框架的关闭按钮执行相同的操作
在主视图/详细 View 中,我有一系列文本字段(以及一个或两个其他控件),它们都与当前所选项目的详细信息有关。它们都共享相同的 DocumentListener,因此如果您更改其中任何一个,将启用一
在一个简单的计算器应用程序中,我使用抽象操作来处理用鼠标单击的按钮以及按下的相应数字键盘键(带有键绑定(bind))。我希望在使用键盘时发生某些外观更改,例如当我按下数字 1 键时更改 JButton
我正在尝试编写一个程序来创建 JPanel,当用户按下 W、A、S 和 D 时,绘制的立方体将在窗口中导航(每次按下某个键时都会导航一定量) Pressed),我创建了 MoveCubeUp 类,并重
我正在制作一款游戏,用户必须按键才能移动。我正在使用键绑定(bind),但它们不起作用。键绑定(bind)应该调用 Wp 类并打印“W按下”,但没有任何反应。代码如下: public class SO
类AbstractAction实现接口(interface)Action,但是在Action中,有一个方法actionPerformed(ActionEvent e),它继承自接口(interface
好的。我有一个大型项目,其中一个特定的 jtable 在启动时创建并且永远不会重建。根据各种用户操作刷新表格模型并重绘表格。 我添加了一个自定义的 TableCellListener 类以响应单元格更
我遇到了一个奇怪的问题。由于在 GUI 中按下按钮,我需要将一些文本导出到文件中。但是,我无法将 IOException 应用于事件调用的 AbstractAction 的 actionPerform
通用代码... 出于某种原因,我的 JMenuItem 没有执行操作。 我做了一个框架,一个JMenuBar和一个JMenuItem,一切都在它应该在的地方。我可以很好地单击 JMenuItem,它会
如果您创建 AbstractActivity 子类,则必须定义以下方法: @Override public void start(AcceptsOneWidget panel, EventBus ev
我正在创建一个ToolBar与一个JButton和一些JCheckBox隐藏或显示 JTable 中的列. JButton主要目的是一旦点击重置所有其他JCheckBox在 ToolBar全部选中或全
通常需要根据另一个 GUI 对象的状态来更改其他 GUI 对象的行为。例如。按下按钮时,标签应更改其名称。但是,当我使用像 JButton myButton = new JButton(myButto
我的 java swing 应用程序有一些在两个 JMenuItems 中使用的 AbstractActions和 JButton。我想将其中一些放入 JButton 内的 JToolbar 中,但是
当我尝试使用 table.setValueAt() 粘贴到 JTable 单元格时,我粘贴的单元格保持空白,但是 setValueAt() 似乎在工作。此外,当我尝试从一个单元格中剪切或复制时,当我想
我是一名优秀的程序员,十分优秀!