【问题标题】:Java keep frame focusedJava保持框架聚焦
【发布时间】:2012-03-16 08:31:44
【问题描述】:

你能帮我解决这个问题吗?我有一个带有一些文本字段、复选框和按钮的 JDialog。我希望当框架不再聚焦时消失。所以我在 JDialog 中添加了一个焦点监听器,当焦点丢失时,我调用dialog.setVisible(false);。问题是,如果我单击复选框、文本字段或按钮,框架会失去焦点并消失。在用户点击它的区域之外之前,我怎样才能让它保持专注?

编辑:我所指的“框架”是一个 JDialog。我不使用 Frame 或 JFrame。所有组件都放置在 JDialog 上。我希望它在不集中时隐藏,但保持集中直到用户在其区域之外单击。

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java swing focus


【解决方案1】:

好像你添加了错误的监听器,你应该添加的是addWindowFocusListener(...),看看这个小示例程序,这是你想要发生的:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DialogFocus 
{
    private JFrame frame;
    private MyDialog myDialog;

    public DialogFocus()
    {
    }

    private void createAndDisplayGUI()
    {
        frame = new JFrame("JFRAME");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);

        myDialog = new MyDialog(frame, "My Dialog", false);

        JButton showButton = new JButton("SHOW DIALOG");
        showButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                if (!(myDialog.isShowing()))
                    myDialog.setVisible(true);
            }
        });

        frame.add(showButton, BorderLayout.PAGE_END);

        frame.setSize(300, 300);
        frame.setVisible(true);
    }

    public static void main(String\u005B\u005D args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new DialogFocus().createAndDisplayGUI();
            }
        });
    }
}

class MyDialog extends JDialog
{
    private WindowFocusListener windowFocusListener;

    public MyDialog(JFrame frame, String title, boolean isModal)
    {
        setTitle(title);
        setModal(isModal);

        JPanel contentPane = new JPanel();

        JTextField tfield = new JTextField(10);
        JComboBox cbox = new JComboBox();
        cbox.addItem("One");
        cbox.addItem("Two");
        cbox.addItem("Three");

        contentPane.add(tfield);
        contentPane.add(cbox);

        windowFocusListener = new WindowFocusListener()
        {
            public void windowGainedFocus(WindowEvent we)
            {
            }

            public void windowLostFocus(WindowEvent we)
            {
                setVisible(false);
            }
        };

        addWindowFocusListener(windowFocusListener);

        add(contentPane);
        pack();
    }
}

【讨论】:

  • @Theo。 : 呵呵,欢迎您,保持微笑 :-)
【解决方案2】:

使对话框模式化,然后用户无法点击框架。

【讨论】:

  • 如果我将其设为模态,焦点监听器将无法工作。请查看我的编辑。
【解决方案3】:

检查FocusEvent 它有public Component getOppositeComponent()。如果对面组件是 JDialog 的子组件,则不要隐藏对话框。

【讨论】:

    猜你喜欢
    • 2011-10-23
    • 2013-03-08
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多