簡體   English   中英

未修飾的 JFrame 顯示不需要的圖標

[英]Undecorated JFrame shows undesired icons

我寫了一個這樣的簡單程序:

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您可以看到左上角的圖標閃爍很短的時間然后消失。

這是一個錯誤嗎? 我怎么解決這個問題? 我使用的是 JDK 13,我的操作系統是 Win8.1

我認為這可能會解決您的問題。 我創建了一個窗口偵聽器來監視要取消最小化的窗口。 然后我將窗口設置為不可見幾毫秒,然后將其重置為可見。 如果它不起作用,您可能希望將該值提高到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);
        }

    }
}

@WJS:事實上,我過去已經找到了一個解決方案,與您的方法非常相似。 但是為了解決您的代碼問題(在任務欄中移動 Jframe 圖標),我像這樣在我的框架中添加了一個窗口偵聽器,並且我使用了 Opacity 而不是 Visibility,我還使用了 WindowActivated 而不是 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);
            }
        });

這工作正常。 但我的主要問題是:為什么我必須做這樣的事情? 這丑陋的東西的來源是什么? 然而JDK已經到了第13個版本,但是這個bug仍然存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM