【问题标题】:Why my Swing based GUI application is not responding?为什么我的基于 Swing 的 GUI 应用程序没有响应?
【发布时间】:2010-02-17 15:02:27
【问题描述】:

我正在尝试使用 (Java + Eclipse + Swing) 创建我的第一个 GUI 应用程序。这是我的代码:

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


public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);

        //====================================================== constructor
        public HelloWorldSwing() {
            //... Set initial text, scrolling, and border.
            m_resultArea.setText("Enter more text to see scrollbars");
            JScrollPane scrollingArea = new JScrollPane(m_resultArea);
            scrollingArea.setBorder(BorderFactory.createEmptyBorder(10,5,10,5));

            // Get the content pane, set layout, add to center
            Container content = this.getContentPane();
            content.setLayout(new BorderLayout());
            content.add(scrollingArea, BorderLayout.CENTER);
            this.pack();
        }

        //============================================================= main
        public static void main(String[] args) {
            JFrame win = new HelloWorldSwing();
            win.setTitle("TextAreaDemo");
            win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            win.setVisible(true);
        }


}

代码取自here

当我从 Eclipse 运行应用程序时,会出现预期的窗口(所以,这很好。我看到了我想看到的)。但是,当我尝试关闭窗口或尝试在文本区域中写入内容时,程序会冻结。操作系统告诉我程序没有响应(我在 Ubuntu 上尝试过)。

谁能帮我找出问题的原因?

提前感谢您的帮助。

【问题讨论】:

  • 我尝试了提供的代码,它工作正常......你还有什么其他的吗?注释掉构造函数的内容得到一个空的JFrame,然后尝试关闭它是否有效?
  • 这与代码无关。它在我的 Windows 机器上运行良好。按预期关闭并写入。你不是在使用 beta jvm 之类的吗?
  • 我试着注释这行代码:content.add(scrollingArea, BorderLayout.CENTER);我仍然有同样的问题。出现一个空窗口,它也不响应。
  • Oso,我认为(我不确定)问题是在我安装 Eclipse 后出现的。在此之前,我能够编译和执行(都从命令行)给定的代码。我在 Ubuntu 上通过“sudo get-apt”获得了 Java 开发工具包。所以,我认为它应该是一个经过测试且稳定的版本。
  • 从命令行运行它是否有效?我用“javac HelloWorldSwing.java”编译它并用“java HelloWorldSwing”运行它,它在 Ubuntu、Mac OS X 和 Debian 上运行良好。

标签: java eclipse user-interface swing freeze


【解决方案1】:

我确信这与代码无关,因为其他人发现代码在他们的机器上运行良好 - 这表明机器特定的问题。在 Eclipse 中,确保将其设置为使用预期的 JDK/JRE。但是,在担心 Eclipse 如何处理您的情况之前,我会先手动运行 - 特别是因为您有一个非常简单的类。

我会检查以确保您使用的是预期的编译器和运行时。在 Linux 上:

which javac
which java

如果它们都符合您的预期,请执行以下操作:

javac HelloWorldSwing.java
java HelloWorldSwing 

如果您遇到类似的问题,那么您就知道这不是 Eclipse 配置,而是其他问题。如果您没有使用最新的 JDK,请升级到最新版本。如果您已经在最迟,它可能是一个显示驱动程序。其他 JAVA swing 程序可以在这台电脑上运行吗?我相信你可以在网上找到一些,下载一个已经打包为 jar 的应用并尝试运行它。

【讨论】:

    【解决方案2】:

    您是否尝试使用 eventdispatcherthread 来查看 JFrame?

    类似:

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                createAndViewJFrame();
            }
        });
    }
    
    public void createAndViewJFrame(){
        JFrame win = new HelloWorldSwing();
        win.setTitle("TextAreaDemo");
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setVisible(true);
    }
    

    然后您的框架将由 swing 调度程序线程显示。

    希望它有所帮助,虽然我只是猜测......

    更新:正如评论者指出的那样,我搞砸了 invokeLater() 调用。我刚刚编辑了这篇文章以纠正它。感谢 yishai & willcodejavaforfood 指出来!

    坦率

    【讨论】:

    • 这不是你调用invokeLater方法的方式。
    • SwingUtilities.invokeLater(new Runnable(){public void run(){createAndViewJFrame()});
    • 我进行了建议的更改。但是,我介绍了一些小的变化。首先,我将 createAndViewJFrame 声明为“静态”(否则主要抱怨:不能对非静态方法进行静态引用)。其次,我交换了“createAndViewJFrame”和“main”(我希望如果没关系)。不幸的是,它并没有解决问题。我的应用程序仍然没有响应。
    【解决方案3】:

    您需要捕获退出事件并 回复System.exit( 0 );

    你应该可以在 大多数在线摇摆示例。

    错误的东西......对不起......咖啡......啊......

    【讨论】:

    • 不应该JFrame.EXIT_ON_CLOSE 照顾吗?
    • 这是个坏建议,因为您在 JFrame 的销毁方法中有一些逻辑,因此在调用 System.exit() 时不会执行它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2016-07-14
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多