Java setFocusableWindowState и setAccelerator не очень хорошо работают

В 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();
      }
    });
  }
}

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


person chrixm    schedule 07.09.2015    source источник


Ответы (1)


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

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

//setJMenuBar(mBar);

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