Java 的 setFocusableWindowState 和 setAccelerator 不能很好地发挥作用

Posted

技术标签:

【中文标题】Java 的 setFocusableWindowState 和 setAccelerator 不能很好地发挥作用【英文标题】:Java's setFocusableWindowState and setAccelerator don't play nicely 【发布时间】:2015-09-07 19:42:22 【问题描述】:

在 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 的最新补丁版本中看到了相同的行为。这看起来像错误,但可以接受其他建议吗?

【问题讨论】:

【参考方案1】:

我什至尝试在窗口可见后设置键盘加速器,但没有成功。

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

//setJMenuBar(mBar);

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

【讨论】:

以上是关于Java 的 setFocusableWindowState 和 setAccelerator 不能很好地发挥作用的主要内容,如果未能解决你的问题,请参考以下文章

JAVA是啥意思

java笔试要点(java.sql包)

Java_核心基础概念

java是啥?

推介一个学习JAVA的系列教程-狗鱼IT教程

一1.Java 的前世今生