【问题标题】:How to keep a component in the background window stay in focus?如何让后台窗口中的组件保持焦点?
【发布时间】:2016-06-28 16:17:00
【问题描述】:

在我的程序中,我有这个主窗口和一个帮助窗口。帮助窗口(打开时)将始终保持在顶部,无论它是否处于焦点。然而问题是,当我尝试通过从 HELP 窗口触发的动作侦听器在主窗口中为组件发送 requestFocusInWindow() 时,它就是不允许我这样做。

实现此目的的正确方法是什么? 泰:)

编辑:

根据要求,这是我正在尝试完成的一个简短示例。本质上,我需要帮助窗口内的按钮来触发对主窗口内 TextField 的焦点。

    import java.awt.*;
    import java.awt.event.*;

    import javax.swing.*;

    public class Main {

        public static void initGUI() {
            mainFrame = new JFrame("Main");
            helpFrame = new JFrame("Help");

            mainFrame.setPreferredSize(new Dimension(500, 200));
            helpFrame.setPreferredSize(new Dimension(500, 200));

            mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            helpFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            mainFrame.setLayout(new FlowLayout());
            helpFrame.setLayout(new FlowLayout());

            mainTextView = new JTextField("", 20);

            mainButton = new JButton("Open Help");
            helpButton = new JButton("Request Focus");

            mainButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource().equals(mainButton)) {
                        helpFrame.pack();
                        helpFrame.setVisible(true);
                    }
                }
            });

            helpButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (e.getSource().equals(helpButton))
                        System.out.println("Focus requested:" + mainTextView.requestFocusInWindow());
                }
            });

            helpFrame.add(helpButton);

            mainFrame.add(mainTextView);
            mainFrame.add(mainButton);

            mainFrame.pack();
            mainFrame.setVisible(true);
        }

        public static void main(String[] args) {
            initGUI();
        }

        static JFrame mainFrame, helpFrame;

        static JTextField mainTextView;

        static JButton mainButton, helpButton;
    }

【问题讨论】:

  • 发布您的SSCCE 来证明问题。在您的 SSCCE 中,主框架将有一个按钮来显示帮助框架,而帮助框架将有一个按钮来请求将焦点重新放在主框架按钮上。首先让它发挥作用。

标签: java swing focus


【解决方案1】:

结果证明修复相当简单。如果使用requestFocus() 而不是requestFocusInWindow(),它似乎工作得很好。

我花了多少时间在这件事上有点愚蠢:P

helpButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource().equals(helpButton))
            mainTextView.requestFocus();
    }
});

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2010-12-07
    • 2015-02-22
    • 2015-06-07
    • 2018-03-18
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多