我的Swing应用程序有什么问题?

时间:2013-01-21 06:21:15

标签: java image swing awt

EDITED 2/2/2013

在你的一些答案和我发现的简单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)

3 个答案:

答案 0 :(得分:2)

  

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

使用SwingUtilies.invokeLater()创建GUI。

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

答案 1 :(得分:1)

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了解更多完整示例

答案 2 :(得分:0)

我不确定你是否解决了问题,但我遇到了类似的问题:对于我的应用程序,我扩展了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位运行时环境之间可能存在一些不兼容性。