2015-09-07 3 views
3

В Windows 7 У меня есть Java-программа, которая запускается с состоянием окна JFrame.ICONIFIED, и у меня есть требование, чтобы он не крал фокус при загрузке.Java setFocusableWindowState и setAccelerator не играют хорошо

Я совершил это, установив 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(); 
     } 
    }); 
    } 
} 

Я вижу такое же поведение на последней версии патча в Java 7 и Java 8. Это выглядит как ошибка, но открыты для других предложений?

ответ

5

Я даже попытался настроить мои ускорители клавиатуры после того, как окно видно, но не повезло.

Я добавил строку меню в конце, и это хорошо работает для меня:

//setJMenuBar(mBar); 

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

Не думать о том, что один, но он работает :) – chrixm