- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个较旧的基于 Java swing 的独立应用程序,它使用 JFrame 和 JMenuBar,其中包含多个 Jmenu 元素(具有相应的 JMenuItem 项)。
在 Windows(7 和 vista)上升级到最新的 1.6.0_41(或 1.7.x)JVM 后,我注意到带有快捷键 Ctrl-C(或 Ctrl-Insert)的菜单项不再收到它的 ActionEvent,如果JTable 被添加到框架中。但是,如果通过鼠标单击访问菜单,则会调用菜单 ActionListener。如果删除了 JTable,则该快捷方式有效。如果我将快捷方式组合更改为 Ctrl-C 或 Ctrl-Insert(即 Ctrl-L)以外的其他内容,则会调用 ActionListener。
它过去的工作方式(我刚刚在 Windows Vista 上使用 jvm 1.4 确认了它 - 我知道该环境得到任何认真关注已经有一段时间了 :) 是 Ctrl-C 将执行标准复制到剪贴板功能如果焦点位于可编辑字段内,则为 JTable。否则,我的菜单 ActionListener 是通过 setAccelerator() 方法分配的快捷方式调用的。
看起来 JTable 实现在 1.6.* 中发生了变化,以在 Windows 上以不同方式处理 Ctrl-C 绑定(bind)事件。
在 Mac OS (JVM 1.6.0_43) 上运行这个应用程序我可以看到 ActionListener 是通过 Ctrl-C 快捷方式调用的。虽然可能是因为 JTable 在 Mac OS 下使用 Command-C 而不是 Ctrl-C 来复制到剪贴板。
我已经提取了演示问题的代码的相关部分。非常感谢任何建议。
public class TestFrame extends JFrame {
public TestFrame(String title) {
super(title);
}
private void init() {
getContentPane().setLayout(new BorderLayout());
addMenu();
addTable();
// Change default exit operation
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
private void addTable() {
JTable jTable = new JTable(createTableModel());
// Place table in JScrollPane
JScrollPane scrollPane = new JScrollPane(jTable);
// Add Table
add(scrollPane, BorderLayout.CENTER);
}
private TableModel createTableModel() {
Object[][] data = new Object[][]{
{new Date(), "First Row, 2nd column", "First Row, 3rd column"},
{new Date(), "Second Row, 2nd column", "Second Row, 3rd column"},
};
Object[] columnNames = new Object[]{"Date", "Type", "Description"};
DefaultTableModel model = new DefaultTableModel(data, columnNames) {
public boolean isCellEditable(int row, int column) {
return column != 0;
}
};
return model;
}
private void addMenu() {
// Create the menu bar.
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu editMenu = new JMenu("Edit");
menuBar.add(editMenu);
TestActionListener listener = new TestActionListener();
JMenuItem menuItem = null;
menuItem = new JMenuItem("Copy 1");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, ActionEvent.CTRL_MASK));
menuItem.addActionListener(listener);
editMenu.add(menuItem);
menuItem = new JMenuItem("Copy 2");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK));
menuItem.addActionListener(listener);
editMenu.add(menuItem);
menuItem = new JMenuItem("Copy 3");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, ActionEvent.CTRL_MASK));
menuItem.addActionListener(listener);
editMenu.add(menuItem);
}
public static void main(String[] args) {
TestFrame frame = new TestFrame("Test");
frame.init();
}
private static class TestActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("TestFrame.TestActionListener.actionPerformed(): e="+ e);
}
}
最佳答案
问题是您的框架没有聚焦,并且整个组件层次结构中没有元素具有焦点,这意味着没有人会“捕获”事件并尝试用它做某事。由于JMenuItem
将他们的快捷方式绑定(bind)到输入映射 JComponent.WHEN_IN_FOCUSED_WINDOW
,您的快捷方式永远不会“回答”事件。
要解决此问题,请将焦点放在其中一个组件上或直接放在 JFrame
上。 (例如 frame.requestFocusInWindow();
)。这里的小例子:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
public class TestFrame extends JFrame {
public TestFrame(String title) {
super(title);
}
private void init() {
getContentPane().setLayout(new BorderLayout());
addMenu();
addTable();
// Change default exit operation
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
private void addTable() {
JTable jTable = new JTable();
// Place table in JScrollPane
JScrollPane scrollPane = new JScrollPane(jTable);
// Add Table
add(scrollPane, BorderLayout.CENTER);
}
private void addMenu() {
// Create the menu bar.
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu editMenu = new JMenu("Edit");
menuBar.add(editMenu);
TestActionListener listener = new TestActionListener();
JMenuItem menuItem = null;
menuItem = new JMenuItem("Copy 1");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, KeyEvent.CTRL_MASK));
menuItem.addActionListener(listener);
editMenu.add(menuItem);
menuItem = new JMenuItem("Copy 2");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_MASK));
menuItem.addActionListener(listener);
editMenu.add(menuItem);
menuItem = new JMenuItem("Copy 3");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, KeyEvent.CTRL_MASK));
menuItem.addActionListener(listener);
editMenu.add(menuItem);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TestFrame frame = new TestFrame("Test");
frame.init();
frame.requestFocusInWindow();
}
});
}
private static class TestActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("TestFrame.TestActionListener.actionPerformed(): e=" + e);
}
}
}
JFrame
如果不需要 SwingUtilities.invokeLater()
从事件调度线程 (EDT) 启动您的 UI 关于java - JMenuItem 快捷键 Ctrl-C/Ctrl-V 或 Ctrl-Insert/Shift-Insert 不再起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16138826/
如何检测在 WPF 中按下了 Ctrl + O 等快捷键(独立于任何特定控件)? 我 try catch KeyDown但KeyEventArgs不会告诉我 Control 或 Alt 是否已关闭。
我想给 JMenuItem 添加一个热键。我学会了如何添加看起来像 CTRL+SOME_KEY 的键。但我需要的是三重热键。类似 CTRL+ALT+W 的东西。我想给 JMenuItem 添加一个热键
我被要求制作一个日文版的桌面应用程序,将来可能会是中文版。所有字符串都保存在资源文件中,其中一些包含用于显示访问/快捷键的下划线,例如“_Save”或“Save _As ...”。当按下 Alt 键时
命令 我们在前面HelloWord章节中已经提到了命令写法,这里再重温一下。 context.subscriptions.push(vscode.commands.registerComma
我目前正在 MSDN 中游泳(淹没),寻找此问题的答案: 像 OneNote 一样,我希望我的通用 Windows 应用程序能够监听快捷方式。然后运行一些东西,并显示结果。 所以我发现了这个关于 La
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我对 Qt 完全陌生。 如何在 Mac 上用代码定义 Cmd + 数字键 键序列? 对于 Windows,我有 QKeySequence(QString("Ctrl+") + QString::num
我为javascript函数制作了一个快捷键。我设置了 S 键来启动此功能,因此设置了 Z 键来清除间隔功能,但我对此感到厌倦,当按 Z 键时,间隔不会停止:( var isCtrl = false;
问题: 我有一个 WebBrowser 并公开了它的 ActiveX 方法。在我的 WebBrowser 所在的表单中,我有一个带有快捷方式的 MainMenuStrip。只有当我在我的表单上的文本框
我正在尝试实现编辑器的快捷方式,但到目前为止还没有取得任何成功。 我想覆盖一些默认的 QScintilla 快捷键。我读过这篇answer ,但我不确定这是否有助于解决我的问题。 我还阅读了 Scin
基本配置(萌新看,大佬请跳到下一节) 1、创建项目 点击Create New Project创建新的项目,点击Open打开已有的项目。 先选择左侧的项目类型,在右边选择项目的所在目录,强烈
当我想用快捷键 ctrl + / 注释或注释掉我的代码时,IntelliJ 将 // 放在第一列而不是电流。当前如何发表评论? 例子 System.out.println(set.co
我经常更改编辑器的字体大小。那么有没有人知道快捷键?到目前为止,我必须通过几次点击来使用菜单:首选项 -> 颜色和字体 -> 基本 -> 文本字体。可以使用 CTRL + MouseWheel 会很好
如何将 Xcode 4 快捷键重置为默认值? Xcode -> 性能 -> 键绑定(bind) 我发现我设置了错误,但找不到重置为原始的方法。 我该怎么办?重新安装 Xcode 4? 最佳答案 只需单
我试图从 TEdit 的 OnKeyPress 事件中检测 Ctrl+V,并且我已经请注意,当按 Ctrl+AnyKey 时,Key 参数会采用不寻常的值。 示例: procedure TForm1.
我定义了这些 requireJs 选项: require.config({ baseUrl: '/js/', paths: { jquery: '/components
最近,FoxitReader for Linux 正式推出,我很喜欢。 http://www.webupd8.org/2015/09/foxit-pdf-reader-sees-new-linux-r
如果您通过查找或 Shift + Cmd + O 在 Appcode 中打开文件,您看不到该文件在项目中的哪个文件夹中。在项目资源管理器中,左侧顶部栏上有一个按钮,如果您将鼠标悬停在它上面,它会显示文
Eclipse 中是否有快捷键可以用其 unicode 转义序列 (\uXXXX) 替换特殊字符(重音)? 最佳答案 作为替代方法,您可以使用 Java 编辑器模板(请参阅 Eclipse Prefe
在 Visual Studio 中,当您在按钮等文本中的字母前使用“&”来获取带下划线的字母快捷方式时,ALT + that letter 执行按钮等。 我想知道如何在 Java 中做到这一点。我知道
我是一名优秀的程序员,十分优秀!