【问题标题】:Undecorated JFrame shows undesired icons未修饰的 JFrame 显示不需要的图标
【发布时间】:2020-01-23 15:00:50
【问题描述】:

我写了一个这样的简单程序:

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

【问题讨论】:

  • 有人告诉你the first time you posted this,所有 Swing 方法都需要在 AWT 事件调度线程上运行,而不是在主线程上运行。将所有代码移动到 Runnable 的 run 方法中,并将该 Runnable 传递给 EventQueue.invokeLater。
  • @VGR 我也试过了。它不能解决问题。但是图标的图像只存在几分之一秒。当我第一次尝试这个时,我什至没有看到它们。
  • @VGR:你能把我的简单代码按照你的意思写出来然后发给我吗?非常感谢
  • @WJS:你有什么建议吗?
  • 也许你可以使用JWindow。但是我看到的几乎看不见的闪光对我来说并不那么令人担忧,所以我不会在意它。不确定您是否可以最小化 JWindow。

标签: java swing jframe


【解决方案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);
        }

    }
}

【讨论】:

  • 不幸的是,当框架可见性设置为 false 然后设置为 true 时,JFrame 在任务栏中的图标会向右移动一点,然后向左移动。
  • 我专注于图标并没有注意到。我对此无能为力。
【解决方案2】:

@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仍然存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2021-09-15
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多