JFrame, как определить, завершено ли дейконификация - PullRequest
1 голос
/ 22 марта 2019

когда я использую WindowListener, я могу определить, когда окно становится иконизированным / deiconified. Моя проблема: мне нужно показать специальное окно безголового инструмента для моего основного кадра. Когда рамка становится иконкой - мне нужно скрыть окно инструментов (работает хорошо). Когда рама исчезнет, ​​мне нужно показать ее снова. Последнее работает только частично: окно инструментов появляется до того, как основной кадр полностью обессоливается из-за задержки анимации. Конечно, я могу добавить небольшой тайм-аут, но это звучит плохо для меня, потому что разные ОС могут иметь различную задержку анимации. Итак, какое событие я должен слушать, чтобы получать уведомления, когда окно полностью деионизировано?

Вот MCVE

import java.awt.Color;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JWindow;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
import javax.swing.border.LineBorder;

/**
 * <code>DeiconifyTest</code>.
 */
public class DeiconifyTest {

    public static void main(String[] args) {
        JFrame frm = new JFrame("Main frame");
        frm.add(new JScrollPane(new JTextArea()));
        frm.setSize(600, 500);
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setVisible(true);
        JWindow nestedWindow = new JWindow(frm);
        JLabel text = new JLabel("Test");
        text.setBorder(new LineBorder(Color.BLACK));
        text.setHorizontalAlignment(SwingConstants.CENTER);
        nestedWindow.add(text);
        nestedWindow.setSize(100, 80);
        nestedWindow.setLocation(610, 0);
        nestedWindow.setVisible(true);
        WindowListener wl = new WindowAdapter() {
            @Override
            public void windowIconified(WindowEvent e) {
                nestedWindow.setVisible(false);
            }

            @Override
            public void windowDeiconified(WindowEvent e) {
                // nestedWindow is visible before the main frame is deiconified
                nestedWindow.setVisible(true);
            }
        };
        frm.addWindowListener(wl);
    }
}

1 Ответ

0 голосов
/ 22 марта 2019
// nestedWindow is visible before the main frame is deiconified
nestedWindow.setVisible(true);

Попробуйте обернуть вышеупомянутый код в SwingUtilities.invokeLater (), чтобы поместить логику в конец EDT, так что, надеюсь, главное окно сначала будет deiconified.

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