Windows 7 では、ウィンドウ状態で開始される Java プログラムがあり、JFrame.ICONIFIEDロード時にフォーカスを盗まないという要件があります。
呼び出す前にに設定setFocusableWindowStateし、後で元に戻すことでこれを達成しました。これは正常に機能し、プログラムはバックグラウンドで効果的にロードされます。falsesetVisibletrue
しかし、キーボード アクセラレータが機能しなくなったことに気付きました。これは、 を使用した直接の結果です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();
}
});
}
}
Java 7 および Java 8 の最新のパッチ リリースで同じ動作が見られます。これはバグのように見えますが、他の提案を受け入れますか?