Java保持框架集中

Teo*_*Teo 4 java swing focus

你能帮帮我吗?我有一个JDialog与一些文本字段,复选框和按钮.我希望当帧不再聚焦时,消失.所以我在JDialog中添加了一个焦点监听器,当焦点丢失时,我打电话给dialog.setVisible(false);.问题是,如果我点击复选框,文本字段或按钮,框架将失去焦点并消失.在用户点击其外部区域之前,我怎么能保持专注?

编辑:我指的"框架"是一个JDialog.我不使用Frame也不使用JFrame.所有组件都放在JDialog上.我希望它在没有聚焦时隐藏,但要保持专注,直到用户点击它的区域外.

nIc*_*cOw 5

好像你添加了错误的Listener,你应该添加的是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();
    }
}
Run Code Online (Sandbox Code Playgroud)