JDialog позволяет основному приложению терять фокус - PullRequest
1 голос
/ 05 мая 2009

Интересно, почему мой JDialog переводит мое основное приложение в фоновый режим. Это означает, что если будет показан JDialog, и пользователь нажмет «ОК» или «ОТМЕНА», основное приложение потеряет фокус и будет перемещено в фоновый режим.

После моего расследования я обнаружил, что это происходит только в том случае, если я отключаю свой основной фрейм во время показа JDialog.

Это поведение может быть воспроизведено с помощью следующего кода:


import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;</p>

<p>import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;</p>

<p>public class FocusTest {</p>

<pre><code>private JFrame frame;

public FocusTest() {
    frame = new JFrame();
    frame.setSize(200,200);
    JButton btn = new JButton("Open Dialog");
    btn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            callDialog(null, "title", "message");
        }
    });
    frame.add(btn);
    frame.setVisible(true);
}

private void callDialog(Component parent, String title, String message) {
    frame.setEnabled(false);
    Thread t1 = new Thread(new Runnable() {
        public void run() {
            JOptionPane optionPane = new JOptionPane("",
                    JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION);
                JDialog dialog = optionPane.createDialog(null, "");
                dialog.setVisible(true);
                frame.setEnabled(true);
        }
    });
    t1.start();
}

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

}

Как можно избежать, чтобы основное приложение теряло фокус? (без включения основного кадра)

Ответы [ 2 ]

4 голосов
/ 05 мая 2009

Вы можете установить следующие опции для класса JDialog

//setUndecorated(true);
setFocusableWindowState(false);
setFocusable(false);

Для этого вы можете создать свой собственный класс JDialog. Вам нужно только расширить JDialog и поместить код в вызов конструктора.

2 голосов
/ 05 мая 2009

Похоже, вы хотите простой диалог модели (то есть диалог, который всплывает и не позволяет пользователю делать что-либо еще, пока он не будет закрыт). Java делает это действительно простым - просто используйте статические методы JOptionPane, чтобы создать нужный диалог.

Попробуйте заменить тело функции callDialog на:

int result = JOptionPane.showConfirmDialog(frame, message, title,
               JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

Над рамкой появится диалоговое окно «да / нет», которое не позволяет вам что-либо делать с рамкой, пока пользователь не нажмет «Да» или «Нет».

Если это не соответствует вашим потребностям, попробуйте позвонить по номеру frame.toFront(), и это вернет JFrame на передний план.

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