Java 的 setFocusableWindowState 和 setAccelerator 玩起来不好

标签 java swing focus acceleratorkey

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

我通过在调用 setVisible 之前将 setFocusableWindowState 设置为 false 并随后将其恢复为 true 来完成此操作.这工作正常,我的程序在后台有效加载。

但是,我注意到我的键盘加速器都不再起作用了,这是使用 setFocusableWindowState 的直接结果。我什至尝试在窗口可见后设置我的键盘加速器,但没有成功。下面的 SSCCE 演示了这个问题 - 如果我调用 setFocusableWindowState,用户无法按 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();
      }
    });
  }
}

我在 Java 7 和 Java 8 的最新补丁版本上看到了相同的行为。这看起来像错误,但是否愿意接受其他建议?

最佳答案

I have even tried setting my keyboard accelerators after the window is visible, but with no luck.

我在最后添加了菜单栏,它对我来说没问题:

//setJMenuBar(mBar);

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

关于Java 的 setFocusableWindowState 和 setAccelerator 玩起来不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32445129/

相关文章:

java - Android 中的模拟位置数据

java - 在数据库操作上发布事件

java - 通过传递大文本从 php 调用 java jar 的最佳/最快方法是什么?

Java Sprite 动画 - 似乎无法让我的 Sprite 正确重绘

java - 面板无法正确地在 Java 中重新绘制图像?

java - 使用 Libvirt Java API 连接到 Qemu

jquery - 使用 jQuery 检查 <input type ="text"> 中的文本输入,为什么此代码不起作用?

不同浏览器上的 Javascript/Flash 焦点问题

macos - 焦点跟随Mac Sierra中的鼠标(不自动提升)

java - SQLiteAssetHelper 扩展返回 null