JFrame java中的无限消失-重新出现循环

2024-03-15

作为继这个帖子 https://stackoverflow.com/questions/34593471/why-do-i-need-to-reset-settext-in-a-jlabel-to-prevent-errors/34598241我遇到了导致计算机崩溃的无限循环。或者,嗯,不完全是:它似乎导致 Java 窗口(JFrame)不断获得焦点/无限地图标化和标准化。像这样不要尝试按原样运行代码。该程序不允许您将其关闭,也不能通过任务管理器来关闭它。

我已经给出了一个完整的代码示例,您可以运行它 - 正如通常建议的那样。由于它是实际程序的精简版本,因此某些代码可能看起来多余(尤其是中间的方法)。重要的方法是:最上面的(构造函数)和最后两个。我猜构造函数和/或refresh method.

正如托马斯指出的here https://stackoverflow.com/questions/34593471/why-do-i-need-to-reset-settext-in-a-jlabel-to-prevent-errors/34598241?noredirect=1#comment57008540_34598241,我将构造函数中的所有代码放在 Runnable 块中,但我想我在那里做错了什么。

重要的是,在实际程序中,此类没有 main 方法,但我从另一个类调用该类,如下所示:

if(getInstance() == null) {
    initOverview(0);
}

设置最后两个窗口侦听器,以便当用户重新打开窗口时,其内容会更新。

我一直在调查文档 https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html,但我不知道我的错误在哪里。我使用 Runnable 示例是否错误?还是因为Window Listener和setExtendedState(保证窗口的“打开”)互相触发?如果是这样,我该如何解决这个问题?

另一个警告:不要执行此代码,它会使您的计算机崩溃

import javax.swing.*;
import java.awt.Color;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.InvocationTargetException;
import java.awt.BorderLayout;
import java.awt.GridLayout;

public class OverviewTest extends JFrame {

    private static final long serialVersionUID = 1L;
    private static OverviewTest instance = null;

    private static JLabel labelTextOverview;
    private static JTabbedPane tabbedPane;
    private static JPanel mapPane;

    private OverviewTest() {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    setTitle("Game - Overview");
                    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                    setResizable(true);
                    setBounds(100, 100, 960, 720);

                    JPanel contentPane = new JPanel();
                    setContentPane(contentPane);
                    contentPane.setLayout(new BorderLayout(0, 0));

                    tabbedPane = new JTabbedPane(JTabbedPane.TOP);

                    contentPane.add(tabbedPane);

                    /* TAB 1: Entity Overview */
                    labelTextOverview = new JLabel();
                    labelTextOverview.setText(entityOverviewHTML());

                    JScrollPane scrollPaneEntityOverview = new JScrollPane(labelTextOverview);

                    tabbedPane.addTab("Entity overview", null, scrollPaneEntityOverview, null);

                    /* TAB 2: Map */
                    mapPane = new JPanel();
                    mapPane.setLayout(new GridLayout(6, 6, 2, 2));
                    fillMap();

                    tabbedPane.addTab("Map", null, mapPane, null);

                    /* TAB 3: Rules */
                    JLabel labelRules = new JLabel();
                    labelRules.setText(rulesHTML());

                    JScrollPane scrollPaneRules = new JScrollPane(labelRules);

                    tabbedPane.addTab("Rules", null, scrollPaneRules, null);

                    // Immediately show window on creation 
                    setVisible(true);
                    setExtendedState(JFrame.ICONIFIED);
                    setExtendedState(JFrame.NORMAL);

                    // Add window listener so that contents get refreshed on window active/focus
                    addWindowListener(new WindowAdapter() {
                        @Override
                        public void windowClosing(WindowEvent e) {
                            setVisible(false);
                        }
                        @Override
                        public void windowActivated(WindowEvent e){
                            refresh(tabbedPane.getSelectedIndex());
                        }
                        @Override
                        public void windowDeiconified(WindowEvent e){
                            refresh(tabbedPane.getSelectedIndex());
                        }
                    });
                }
            });
        } catch (InvocationTargetException | InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        if(getInstance() == null) {
            initOverview(0);
        }
    }
    private String rulesHTML() {
        StringBuilder sbRules = new StringBuilder();

        sbRules.append("<html><body style='padding: 12px;'>");

        sbRules.append("<h2>Some text for Rules</h2>");
        sbRules.append("<h3>Lorem ipsum</h3>");

        sbRules.append("</body></html>");

        return sbRules.toString();
    }

    private static void fillMap() {
        mapPane.removeAll();
        for (int i = 0; i < 36; i++) {
            JLabel textTile = new JLabel(fillTile(i));
            JScrollPane tile = new JScrollPane(textTile);

            tile.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            mapPane.add(tile);
        }
    }
    private static String fillTile(int i) {
        StringBuilder sbTile = new StringBuilder();

        sbTile.append("<html>");
        sbTile.append("some text");
        sbTile.append("</html>");

        return sbTile.toString();
    }

    /**
     * Reset UI components to system default
     */
    public static void initOverview(int index) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch (UnsupportedLookAndFeelException | ClassNotFoundException | InstantiationException | IllegalAccessException e) {
            System.err.println(e);
        }
        instance = new OverviewTest();
        tabbedPane.setSelectedIndex(index);
    }

    public static OverviewTest getInstance() {
        return instance;
    }

    private static String entityOverviewHTML() {
        StringBuilder sb = new StringBuilder();

        sb.append("<html><body style='padding: 12px;'>");

        sb.append("<h2>Some text for Rules</h2>");
        sb.append("<h3>Lorem ipsum</h3>");

        // Normally a loop that runs over getEntityInfo();
        sb.append(getEntityInfo());
        sb.append("</body></html>");

        return sb.toString();
    }

    private static StringBuilder getEntityInfo() {
        StringBuilder sbInfo = new StringBuilder();

        sbInfo.append("this is not a drill, but a test");        

        return sbInfo;
    }

    private static void bringToFront() {
        getInstance().setVisible(true);
        getInstance().setExtendedState(JFrame.ICONIFIED);
        getInstance().setExtendedState(JFrame.NORMAL);
    }

    public static void refresh(int index) {
        labelTextOverview.setText(entityOverviewHTML());
        fillMap();
        tabbedPane.setSelectedIndex(index);
        getInstance().repaint();
        bringToFront();
    }
}

我不完全确定你为什么同时调用两者

    getInstance().setExtendedState(JFrame.ICONIFIED);
    getInstance().setExtendedState(JFrame.NORMAL);

但如果你删除第一个,即简单地:

    getInstance().setExtendedState(JFrame.NORMAL);

然后它只打开窗口一次,而没有您描述的无限循环。

您的代码导致无限循环的原因是它最小化然后取消最小化框架,这会导致windowActivated正在运行的方法:这会调用refresh方法,它调用bringToFront方法,最小化和取消最小化框架等。


为了真正将窗口带到前面,以下内容对我有用,基于这个问题 https://stackoverflow.com/questions/309023/how-to-bring-a-window-to-the-front:

private static void bringToFront() {                                                             
    getInstance().setVisible(true);                                                              
    getInstance().setExtendedState(JFrame.NORMAL);                                               
    getInstance().toFront();                                                                     
    getInstance().repaint();                                                                     
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JFrame java中的无限消失-重新出现循环 的相关文章

随机推荐

  • 可以在 PHP 中测试变量是否是静态的吗?

    PHP 中是否可以测试变量是否是静态的 我正在尝试创建一个神奇的方法 get它还查看静态变量 我发现property exists 当变量也是静态时返回 true 但我需要使用 代替 gt 我会期待吗 可以通过反射测试变量是否是静态的 cl
  • 构建多部分响应

    考虑到多个 HTTP 请求的响应 我必须从中构建一个多部分响应 我面临的问题是如何在最终的多部分响应中设置单个响应的响应标头 为了 例如 HttpClient client new HttpClient HttpRequestMessage
  • 带标头的 Alamofire POST 请求

    我正在尝试在 Swift 中使用 Alamofire 发出带有标头的发布请求 然而 我不断得到方法调用中的额外参数错误 我正在使用 Alamofire 4 5 版本 我无法找出错误 请查找附件中的代码 let headers Authori
  • 流星中的 Bootstrap 3 模态未显示

    我试图让 bootstrap 3 模态弹出流星应用程序 但没有成功 一切似乎都已就位 我已经在这里和其他地方搜索过 但它根本行不通 HTML 是
  • 如何使用 xml 设置颜色可绘制的圆角半径?

    在android网站上 有一个关于颜色绘图的部分 http developer android com guide topics resources available resources html colordrawableresourc
  • 计算成员中的 WHERE 子句

    我面临一些通过比较维度值来计算值的问题 我有 3 个维度 数据类型 客户 产品 和一个度量 GrossSales 如果我想要 ProductID 1 2 3 且 Dataype 4 5 6 的 GrossSales MDX 查询是什么 这里
  • 在数据库中存储年份[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 年份数据的最佳 PostgreSQL 数据类型是什么 例如 2006 年或 1847 年 TEXT SMALLINT DATE 理想情况下
  • 字符串性能 - Windows 10 下的 Python 2.7 与 Python 3.4 对比 Ubuntu

    Use case一个简单的函数 用于检查特定字符串是否在另一个字符串中的位置为 3 的倍数 请参阅此处现实世界的例子 https en wikipedia org wiki Stop codon 在 DNA 序列中寻找终止密码子 功能 sl
  • Android SD卡目录文件夹名称列表

    如何获取 SD 卡上特定目录中的所有文件夹 不是文件 的名称 例如 所有子文件夹名称 sdcard first level folder 我需要文件夹名称 因此我可以将完整路径 字符串 传递给方法 然后将其压缩 zip Thanks 我想你
  • Java SE 6 中 Sun JVM 的默认最大堆大小是多少?

    Java SE 6 中 Sun JVM 的默认最大堆大小是多少 即相当于设置 Xmx 看起来对于带有服务器级机器的 Java SE 5 it s http java sun com j2se 1 5 0 docs guide vm gc e
  • jsf 安全约束在用户未登录时保护链接?

    我有一个定义了安全约束的 JSF2 GlassFish 3 0 应用程序 示例如下 我的问题是 我有一个 注册 链接 当用户登录时不应访问该链接 也就是说 如果他们尝试点击 signup jsf 如果他们已登录 他们应该能够访问 所以如果他
  • Rails 模型 has_many 具有多个foreign_keys

    对 Rails 来说相对较新 并尝试使用具有姓名 性别 father id 和 mother id 2 个父母 的单个 Person 模型来建模非常简单的家庭 树 下面基本上是我想做的 但显然我不能在 has many 中重复 childr
  • 是否可以从 Android 应用程序执行 Shell 脚本

    我一直在尝试 Android 终端模拟器 Termux 这是一款优秀的应用程序 无需 root 访问即可访问 Android 操作系统 我希望能够实现的是从同一设备上安装的另一个 Android 应用程序中执行 Termux 中的脚本 命令
  • Storm程序的执行流程

    我是 Storm 的新手 试图了解不同方法的执行流程spout to bolt 就像spout有不同的方法一样 下一个元组 open 声明输出字段 启用 停用 Bolt 有类似的方法 准备 执行 清理 声明输出字段 那么谁能告诉我这些方法的
  • 将数据传递给 Polymer 元素

    使用 Web UI 时 我可以将数据传递给组件 如下所示
  • 卷积神经网络的 float16 与 float32

    标准是float32 但我想知道在什么条件下可以使用float16 我比较了运行相同的 covnet 和两种数据类型 没有发现任何问题 对于大型数据集 我更喜欢 float16 因为我可以更少担心内存问题 令人惊讶的是 使用 16 位是完全
  • 在docker中挂载两个嵌套的只读挂载点

    我有一个docker compose文件运行 PHP 并以嵌套方式安装一些卷 它已经工作了两年了 最近我又尝试了一次 但失败了 至少在 Docker for WSL 2 上是这样 以下是 docker compose 文件中挂载的卷 vol
  • 如何设置 git 提交消息的模式?

    我想限制提交的人具有特定的提交消息格式 我该怎么做 例如 Pair Name Story Number Commit Message 有一个pre commit msg or commit msg钩子 你可以使用 http www kern
  • 使用函数给定的值初始化 numpy 数组的最快方法

    我主要对 d1 d2 numpy 数组 矩阵 感兴趣 但这个问题对于具有更多轴的数组来说是有意义的 我有函数 f i j 我想通过该函数的某些操作来初始化数组 A np empty d1 d2 for i in range d1 for j
  • JFrame java中的无限消失-重新出现循环

    作为继这个帖子 https stackoverflow com questions 34593471 why do i need to reset settext in a jlabel to prevent errors 34598241