В 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. Это выглядит как ошибка, но открыты для других предложений?
Не думать о том, что один, но он работает :) – chrixm