Undecorated JFrame показывает нежелательные значки - PullRequest
0 голосов
/ 23 января 2020

Я написал простую программу, подобную этой:

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

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame("MyFirstJavaProgram");
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(true);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Когда рамка свернута (щелкнув по ее значку на панели задач), а затем восстановлена, она показывает нежелательные значки, такие как значки строки заголовка ( закрыть значок, свернуть и развернуть), а затем показывает недокрашенный JFrame.

Вот видео моей проблемы: http://www.mediafire.com/file/k2uzd0b8uupd1h9/Video.mp4/file вы можете видеть значки в верхнем левом углу этот фла sh на очень короткое время и затем исчезает.

Это ошибка? Как я могу решить эту проблему? Я использую JDK 13 и моя ОС Win8.1

Ответы [ 2 ]

0 голосов
/ 23 января 2020

@ W JS: На самом деле в прошлом я достиг решения, очень похожего на ваш подход. но для решения вашей проблемы с кодом (перемещение значка Jframe на панели задач) я добавил слушатель окна в свой фрейм, как это, и я использовал непрозрачность вместо видимости, я также использовал WindowActivation вместо WindowDeiconified:

frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowActivated(WindowEvent e) {
                try {
                    Thread.sleep(20);
                } 
                catch(InterruptedException ex) {}
                frame.setOpacity(1f);
            }
            @Override
            public void windowIconified(WindowEvent e) {
                frame.setOpacity(0f);
            }
        });

this работает отлично. но мой главный вопрос: почему я должен делать что-то подобное? каков источник этой ужасной вещи? Однако JDK достиг 13-й версии, но эта ошибка все еще остается.

0 голосов
/ 23 января 2020

Я думаю, что это может решить вашу проблему. Я создал слушатель окна, чтобы следить за тем, чтобы окно было минимизировано. Затем я устанавливаю окно невидимым на несколько миллисекунд, а затем сбрасываю его на видимое. Если это не работает, вы можете увеличить значение до Thread.sleep().

    public static void main(String[] args) {
        SwingUtilities
                .invokeLater(() -> new Testit().start()); // starts on the EDT.
    }

    public void start() {
        JFrame frame = new JFrame();
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(
                JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(true);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.addWindowListener(
                new MyWindowListener(frame));

    }

    private class MyWindowListener extends WindowAdapter {
        JFrame frame;

        public MyWindowListener(JFrame frame) {
            this.frame = frame;
        }

        @Override
        public void windowDeiconified(WindowEvent we) {
            frame.setVisible(false);
            try {
                Thread.sleep(10);
            } catch (InterruptedException ie) {
            }
            frame.setVisible(true);
        }

    }
}

...