2011-05-20 4 views
2

私はJava SunのチュートリアルからSplashDemo.javaを探しています。このクラスは、アプリケーションの起動時にスプラッシュ画面を作成する方法を示しています。 SplashDemoはmainメソッドに直接フレームを作成します。この例では、invokeLaterを使用してイベントディスパッチスレッドでGUIコードを実行しないのはなぜですか?EDTの外でGUIの作業を行っているSunのデモ?

/* 
* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. 
* 
* Redistribution and use in source and binary forms, with or without 
* modification, are permitted provided that the following conditions 
* are met: 
* 
* - Redistributions of source code must retain the above copyright 
*  notice, this list of conditions and the following disclaimer. 
* 
* - Redistributions in binary form must reproduce the above copyright 
*  notice, this list of conditions and the following disclaimer in the 
*  documentation and/or other materials provided with the distribution. 
* 
* - Neither the name of Oracle or the names of its 
*  contributors may be used to endorse or promote products derived 
*  from this software without specific prior written permission. 
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
*/ 

/* 
* SplashDemo.java 
* 
*/ 

import java.awt.*; 
import java.awt.event.*; 

public class SplashDemo extends Frame implements ActionListener { 
    static void renderSplashFrame(Graphics2D g, int frame) { 
    final String[] comps = {"foo", "bar", "baz"}; 
    g.setComposite(AlphaComposite.Clear); 
    g.fillRect(120,140,200,40); 
    g.setPaintMode(); 
    g.setColor(Color.BLACK); 
    g.drawString("Loading "+comps[(frame/5)%3]+"...", 120, 150); 
    } 
    public SplashDemo() { 
    super("SplashScreen demo"); 
    setSize(300, 200); 
    setLayout(new BorderLayout()); 
    Menu m1 = new Menu("File"); 
    MenuItem mi1 = new MenuItem("Exit"); 
    m1.add(mi1); 
    mi1.addActionListener(this); 
    this.addWindowListener(closeWindow); 

    MenuBar mb = new MenuBar(); 
    setMenuBar(mb); 
    mb.add(m1); 
    final SplashScreen splash = SplashScreen.getSplashScreen(); 
    if (splash == null) { 
     System.out.println("SplashScreen.getSplashScreen() returned null"); 
     return; 
    } 
    Graphics2D g = splash.createGraphics(); 
    if (g == null) { 
     System.out.println("g is null"); 
     return; 
    } 
    for(int i=0; i<100; i++) { 
     renderSplashFrame(g, i); 
     splash.update(); 
     try { 
     Thread.sleep(90); 
     } 
     catch(InterruptedException e) { 
     } 
    } 
    splash.close(); 
    setVisible(true); 
    toFront(); 
    } 
    public void actionPerformed(ActionEvent ae) { 
    System.exit(0); 
    } 

    private static WindowListener closeWindow = new WindowAdapter(){ 
    public void windowClosing(WindowEvent e){ 
     e.getWindow().dispose(); 
    } 
    }; 

    public static void main (String args[]) { 
    SplashDemo test = new SplashDemo(); 
    } 
} 

答えて

6

私はいつもスイングコンポーネントがEDTに更新&を作成する必要があることを聞いたことがある:

はここで完全なソースです。そのソースは、AWTクラスを排他的に使用します。

+2

鷲の目に+1! – trashgod

+0

素早くお返事ありがとうございます。 – Berry

0

コンポーネントのどれも実現されていない限り、Swingオブジェクトを変更することは安全です。したがって、これがSwingコードであっても、メインスレッド上でオブジェクトを構築またはスイングすることはまだ安全です。

Realizedは、オブジェクトのpaintメソッドが呼び出される可能性があることを意味します。

http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

規則の例外と呼ばれるセクションを確認してください。

関連する問題