chr*_*ixm 3 java swing focus acceleratorkey
在Windows 7下,我有一个以窗口状态启动的Java程序,JFrame.ICONIFIED
我要求它在加载时不会窃取焦点.
我通过设置setFocusableWindowState
到false
调用之前完成此操作setVisible
,然后将其恢复到true
之后.这工作正常,我的程序在后台有效加载.
但是,我注意到我的键盘加速器都不再工作,这是使用的直接结果setFocusableWindowState
.我甚至尝试在窗口可见后设置我的键盘加速器,但没有运气.下面SSCCE说明了问题-用户不能按Ctrl + T,如果我打电话setFocusableWindowState
.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SSCCE extends JFrame implements ActionListener {
private JMenuBar mBar;
private JMenu mFile;
private JMenuItem miTest;
public SSCCE() {
setSize(300, 200);
mBar = new JMenuBar();
mFile = new JMenu("File");
miTest = new JMenuItem("Test");
miTest.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
miTest.addActionListener(this);
mFile.add(miTest);
mBar.add(mFile);
setJMenuBar(mBar);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setExtendedState(getExtendedState() | JFrame.ICONIFIED);
setFocusableWindowState(false);
setVisible(true);
setFocusableWindowState(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(miTest)) {
System.out.println("Testing...");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new SSCCE();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我在Java 7和Java 8的最新补丁版本上看到了相同的行为.这看起来很像,但是对其他建议开放?
我甚至尝试在窗口可见后设置我的键盘加速器,但没有运气.
我在最后添加了菜单栏,它对我来说还可以:
//setJMenuBar(mBar);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setExtendedState(getExtendedState() | JFrame.ICONIFIED);
setFocusableWindowState(false);
setVisible(true);
setFocusableWindowState(true);
setJMenuBar(mBar);
Run Code Online (Sandbox Code Playgroud)