Java';s setFocusableWindowsState和setAccelerator don';我打得不好

Java';s setFocusableWindowsState和setAccelerator don';我打得不好,java,swing,focus,acceleratorkey,Java,Swing,Focus,Acceleratorkey,在Windows7下,我有一个Java程序,它以JFrame.ICONIFIED的窗口状态启动,并且我有一个要求,它在加载时不会窃取焦点 在调用setVisible之前,我将setFocusableWindowState设置为false,然后将其恢复为true。这很好,我的程序在后台有效加载 然而,我注意到我的键盘加速器都不能再工作了,这是使用setFocusableWindowState的直接结果。我甚至尝试在窗口可见后设置键盘加速器,但没有成功。下面的SSCCE演示了该问题-如果我调用set

在Windows7下,我有一个Java程序,它以
JFrame.ICONIFIED
的窗口状态启动,并且我有一个要求,它在加载时不会窃取焦点

在调用
setVisible
之前,我将
setFocusableWindowState
设置为
false
,然后将其恢复为
true
。这很好,我的程序在后台有效加载

然而,我注意到我的键盘加速器都不能再工作了,这是使用
setFocusableWindowState
的直接结果。我甚至尝试在窗口可见后设置键盘加速器,但没有成功。下面的SSCCE演示了该问题-如果我调用
setFocusableWindowsState
,则用户无法按CTRL+t

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();
      }
    });
  }
}
我在Java7和Java8的最新补丁版本中看到了相同的行为。这看起来像是bug,但可以接受其他建议吗

我甚至尝试在窗口可见后设置键盘加速器,但没有成功

我在最后添加了菜单栏,它对我来说还可以:

//setJMenuBar(mBar);

setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setExtendedState(getExtendedState() | JFrame.ICONIFIED);
setFocusableWindowState(false);
setVisible(true);
setFocusableWindowState(true);
setJMenuBar(mBar);