Java держать кадр в фокусе - PullRequest
4 голосов
/ 16 марта 2012

Не могли бы вы помочь мне в этом?У меня есть JDialog с некоторыми текстовыми полями, флажками и кнопками.Я хочу, чтобы, когда рамка больше не фокусировалась, исчезать.Поэтому я добавил слушателя фокуса в JDialog, и когда фокус теряется, я звоню dialog.setVisible(false);.Проблема в том, что если я нажимаю на флажок, текстовое поле или кнопку, рамка теряет фокус и исчезает.Как я мог держать это сосредоточенным, пока пользователь не щелкает за пределами его области?

РЕДАКТИРОВАТЬ: "рамка", о которой я говорю, является JDialog.Я не использую ни кадр, ни JFrame.Все компоненты размещены на JDialog.Я хочу, чтобы он скрывался, когда не сфокусирован, но оставляю его сфокусированным, пока пользователь не щелкнет за пределами его области.

Ответы [ 3 ]

5 голосов
/ 16 марта 2012

Похоже, вы добавили неверный слушатель, вам нужно добавить 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();
    }
}
2 голосов
/ 16 марта 2012

Проверьте, что FocusEvent имеет public Component getOppositeComponent().Если противоположный компонент является дочерним компонентом JDialog, не скрывайте диалоговое окно.

2 голосов
/ 16 марта 2012

Сделайте диалог модальным, тогда пользователь не сможет щелкнуть по фрейму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...