【问题标题】:What is wrong with my Swing application?我的 Swing 应用程序有什么问题?
【发布时间】:2013-01-04 04:37:28
【问题描述】:

2013 年 2 月 2 日编辑

在你的一些答案和我找到的一个简单的 Swing 应用程序指南的帮助下,我能够取得一点进步,我现在把它全部放在一个类中。但是,我仍然无法关闭它,我不得不制作一个按钮来完成它,因为不得不拉起任务管理器真的很烦人。工具提示也不起作用。我不知道这是否重要,但我在 Eclipse 中这样做。

import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Thing extends JFrame
{
    private static final long serialVersionUID = 1L;

    public Thing()
    {
        setTitle("Thing");
        setSize(1024, 768);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);

        JPanel panel = new JPanel();
        getContentPane().add(panel);
        panel.setLayout(null);
        panel.setToolTipText("A panel container");

        JButton quit = new JButton("Quit");
        quit.setBounds(50, 60, 80, 30);
        quit.setToolTipText("A button component");
        quit.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent event)
            {
                System.exit(0);
            }
        });
        panel.add(quit);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                Thing thing = new Thing();
                thing.setVisible(true);
            }
        });
    }
}

这是我尝试用 X 关闭它时出现的错误。(关闭按钮可以正常工作)

java.lang.NoClassDefFoundError: sun/awt/TimedWindowEvent
    at sun.awt.windows.WToolkit.eventLoop(Native Method)
    at sun.awt.windows.WToolkit.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

【问题讨论】:

  • 请注意:您应该在构造函数中加载图像,然后存储对图像的引用,而不是每次要绘制图像时都加载图像。
  • g.drawImage(Toolkit.getDefaultToolkit().getImage("image.jpg"), 0, 0, null); 不要尝试在绘画方法中加载图像!在构造时阅读它(或者更好的是,定义一个接受Image 的构造函数)。只需将其涂上油漆即可。所以假设它是一个名为 image 的类属性,可能会变成.. g.drawImage(image, 0, 0, this);
  • 1) Title 应该返回(大概)1200x1200 的首选尺寸。 2) 完成此操作后,pack() 框架和setLocationByPlatform(true) 3) 除非此图像旨在作为其他组件的 BG,否则请考虑将其显示在标签中。 4)忘记在最终代码sn-p中突出显示对this的引用。 JPanel 实现了ImageObserver,因此使用对象本身作为图像加载通知。随着更多图像可用,将触发重绘。

标签: java image swing awt


【解决方案1】:

由于某种原因,我无法关闭它,必须使用任务管理器。

使用SwingUtilies.invokeLater() 创建图形用户界面。

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

【讨论】:

  • 它似乎没有改变任何东西。我复制了网站上的代码并将其粘贴到 main() 方法中,然后将我的所有代码剪切并粘贴到 createAndShowGUI();这就是我需要做的还是我误解了?它仍然给出相同的错误,我现在将其放入原始帖子中。
【解决方案2】:

Toolkit.getDefaultToolkit().getImage("image.jpg") 可能使用后台加载程序从主绘制线程(或事件调度线程,AKA EDT)加载图像。

这基本上意味着,该方法将立即返回,但图像实际上并没有加载。

这是为低容量带宽系统完成的(早在过去),以防止系统在图像下载并加载到内存时停止。现在,这已经不是什么大问题了。

相反,在Title 的构造函数中,您应该预加载图像...

private BufferedImage background;
public Title() throws IOException {        
    background = ImageIO.read(new File("image.jpg"));
}

在您的paintComponent 方法中...

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    if (background != null) {
        g.drawImage(background, 0, 0, this);
    }
}

您当前加载图像的方法的其他问题涉及它如何处理错误。您当前的方法往往会默默地消耗错误,并且很难确定实际出了什么问题。

您可以查看JButton only show up on mouseover 以获取更多完整示例

【讨论】:

  • 谢谢,图像现在可以正常工作,但是没有任务管理器窗口仍然无法关闭。有机会我会阅读您提供的链接。
  • 听起来您在 EDT 中有其他东西(如循环或阻塞操作和/或 Thread.sleep 或 Object#wait),这将阻止 EDT 响应关闭事件跨度>
【解决方案3】:

我不确定您是否解决了问题,但我遇到了类似的问题:对于我的应用程序,我扩展了 JFrame,但无法使用任何 setDefaultCloseOperation(...) 关闭或隐藏它。在最小化、恢复或最大化框架时,我遇到了与您在上面显示的相同的错误。
我修复了它将 jdk 和 jre 更新到 最新的 Java 1.7 并使用它。在 Eclipse 中,转到 Window > Preferences > Java > Installed JREs 并选择您最新的 Java如果在 64 位系统上工作,最好也使用 64 位 Java。在子菜单> Execution Environment 中选择左侧的 Java 1.7 和右侧的兼容 Java 1.7 64 位 JRE。
我不确定到底是什么问题,但我猜 Java 64 位应用程序和 32 位运行时环境之间可能存在一些不兼容。

【讨论】:

  • 这只是我为了好玩而做的事情,所以我还没有回到这个问题上。我会尽快解决的;听起来它可能会起作用。
猜你喜欢
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
相关资源
最近更新 更多