- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:我有一个表格单元格编辑器,调用它时会弹出一个对话框,其中包含一个复选框列表和 2 个按钮(确定和取消)。一切正常。后来我注册了键盘操作,以便 ENTER 和 ESCAPE 键可以执行确定/取消操作。仍然没有问题。
使用相同的技术,我尝试注册 SPACE 键来执行第三个操作。这个没火示例代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DialogTest implements Runnable
{
JDialog dialog;
JList jlist;
public static void main(String[] args)
{
SwingUtilities.invokeLater(new DialogTest());
}
public void run()
{
ActionListener okListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
close(true);
}
};
ActionListener cancelListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
close(false);
}
};
ActionListener otherListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
doOther();
}
};
JButton okButton = new JButton("OK");
okButton.addActionListener(okListener);
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(cancelListener);
jlist = new JList(new String[]{"A", "B", "C", "D", "E", "F", "G"});
jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jlist.setVisibleRowCount(5);
JScrollPane scroll = new JScrollPane(jlist);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
JPanel buttonsPanel = new JPanel(new FlowLayout());
buttonsPanel.add(okButton);
buttonsPanel.add(cancelButton);
JPanel content = new JPanel(new BorderLayout());
content.add(scroll, BorderLayout.CENTER);
content.add(buttonsPanel, BorderLayout.SOUTH);
dialog = new JDialog((Frame) null, true);
dialog.setContentPane(content);
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.getRootPane().registerKeyboardAction(okListener,
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),
JComponent.WHEN_IN_FOCUSED_WINDOW);
dialog.getRootPane().registerKeyboardAction(cancelListener,
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
JComponent.WHEN_IN_FOCUSED_WINDOW);
// This doesn't work
dialog.getRootPane().registerKeyboardAction(otherListener,
KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0),
JComponent.WHEN_IN_FOCUSED_WINDOW);
dialog.setVisible(true);
}
private void close(boolean commit)
{
if (commit)
{
System.out.println("Now saving...");
}
else
{
System.out.println("Now closing...");
System.exit(0);
}
}
private void doOther()
{
System.out.println("current selection: " + jlist.getSelectedValue());
}
}
编辑
感谢 mKorbel 的建议(和有用的链接!),我让它工作了:
1) 将 ActionListener otherListener = new ActionListener(){...}
行更改为:
Action otherListener = new AbstractAction(){...}
2) 将 SPACE 击键注册更改为:
KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0);
Object key = keyStroke.toString();
jlist.getInputMap().put(keyStroke, key);
jlist.getActionMap().put(key, otherAction);
请注意,注册是针对 JList,而不是其他 2 个击键的 JDialog。
最佳答案
很难对陛下说什么菜刀....
编辑
我忘记了 SPACE 已将 KeyBindings 注册为人类 JButtons 加速器(鼠标、ENTER 和 SPACE),如果选择 JButton 则可能会并发
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DialogTest implements Runnable {
private JDialog dialog;
private JList jlist;
public static void main(String[] args) {
SwingUtilities.invokeLater(new DialogTest());
}
@Override
public void run() {
ActionListener okListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
close(true);
}
};
ActionListener cancelListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
close(false);
}
};
ActionListener otherListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doOther();
}
};
JButton okButton = new JButton("OK");
okButton.addActionListener(okListener);
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(cancelListener);
jlist = new JList(new String[]{"A", "B", "C", "D", "E", "F", "G"});
jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jlist.setVisibleRowCount(5);
JScrollPane scroll = new JScrollPane(jlist);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
JPanel buttonsPanel = new JPanel(new FlowLayout());
buttonsPanel.add(okButton);
buttonsPanel.add(cancelButton);
JPanel content = new JPanel(new BorderLayout());
content.add(scroll, BorderLayout.CENTER);
content.add(buttonsPanel, BorderLayout.SOUTH);
dialog = new JDialog((Frame) null, true);
dialog.setContentPane(content);
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.getRootPane().registerKeyboardAction(okListener,
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
dialog.getRootPane().registerKeyboardAction(cancelListener,
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
// This doesn't work
/*dialog.getRootPane().registerKeyboardAction(otherListener,
KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0),
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);*/
dialog.getRootPane().getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "doSomething");
dialog.getRootPane().getActionMap().put("doSomething", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
dialog.setVisible(true);
}
private void close(boolean commit) {
if (commit) {
System.out.println("Now saving...");
} else {
System.out.println("Now closing...");
System.exit(0);
}
}
private void doOther() {
System.out.println("current selection: " + jlist.getSelectedValue());
}
}
关于java - 使用 VK_SPACE 的 registerKeyboardAction 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13630099/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!