1

2013 年 2 月 2 日編集

いくつかの回答と、私が見つけた簡単な Swing アプリケーション ガイドの助けを借りて、少し進歩することができました。今のところ、すべてを 1 つのクラスにまとめました。しかし、私はまだそれを閉じることができず、それを行うためのボタンを作成する必要がありました. ツールチップも機能しません。それが問題かどうかはわかりませんが、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)
4

3 に答える 3

2

なんらかの理由で閉じることができず、タスクマネージャーを使用する必要があります。

SwingUtilies.invokeLater()GUI の作成に使用します。

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

于 2013-01-21T06:24:19.860 に答える
1

Toolkit.getDefaultToolkit().getImage("image.jpg")バックグラウンドローダーを使用して、メインペイントスレッド(またはイベントディスパッチスレッド、別名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を参照してください。

于 2013-01-21T09:42:01.657 に答える
0

問題を解決したかどうかはわかりませんが、同様の問題がありました。私のアプリケーションでは、JFrame を拡張しましたが、setDefaultCloseOperation(...) で閉じたり隠したりすることができませんでした。フレームを最小化、復元、または最大化すると、上記と同じエラーが発生しました。jdkとjreの両方を最新のJava 1.7に更新して使用する
ことで修正しました。Eclipse では、 64 ビット システムで作業している場合は、最新の Java に移動して選択します。64 ビット Java も使用することをお勧めします。サブメニューで、左側で Java 1.7 を選択し、右側で互換性のある Java 1.7 64 ビット JRE を選択します。 正確に何が問題だったのかはわかりませんが、おそらく Java 64 ビット アプリケーションと 32 ビット ランタイム環境の間に何らかの非互換性があると思います。Window > Preferences > Java > Installed JREs> Execution Environment

于 2013-03-28T07:53:43.360 に答える