- PR -

スプラッシュ ウィンドウの実現

1
投稿者投稿内容
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2004-01-20 10:14
いつもお世話になっています。
環境
OS = Windows2000
開発Tool = JBuilder 8
JDK = 1.2

今回スプラッシュウィンドウを実現したく試行錯誤しております。
Googleで検索し"http://numata.aquasky.jp/programming/java/component/SplashWindow.html#01"を参考に自分でスプラッシュクラスを作成しようと思ったのですが、上手くいきません。

まず今回Swingが使用できない為、サンプルにあるような"extends JWindow"はできず
"extends Window"とした所
"Constructor Window()はpublicクラスjava.awt.Windowではありません。"
というエラーが表示されてしまいます。なぜでしょうか?

他にもスプラッシュウィンドウの実現にはこんな方法もあるよ、という事があれば教えてください。


下記が参考にしたClassです。
******************************************************************************
class SplashWindow extends JWindow {
 /** メインウィンドウ */
 private Component mainWindow;
 /** イメージ */
 private Image image;
 /** イメージのサイズ*/
 private Dimension imageSize = new Dimension();

 /** コンストラクタ */
 public SplashWindow(Component mainWindow) {
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  MediaTracker mt = new MediaTracker(this);

  this.mainWindow = mainWindow;

  // イメージの読み込み
  image = Toolkit.getDefaultToolkit().getImage("image.jpg");
  mt.addImage(image, 0);
  try {
   mt.waitForAll();
  } catch (InterruptedException ex) {
   ex.printStackTrace();
  }
  imageSize.width = image.getWidth(this);
  imageSize.height = image.getHeight(this);

  // ウィンドウのサイズと位置の設定
  setBounds(
   (screenSize.width - imageSize.width) / 2,
   (screenSize.height - imageSize.height) / 2,
   imageSize.width, imageSize.height
   );
  }

  /** スプラッシュウィンドウの機能 */
  public void doSplash() {
   Thread switchingThread = new SwitchingThread();
   // スプラッシュウィンドウをON
   setVisible(true);
   // 切り替えスレッドのスタート
   switchingThread.start();
  }

  /** 描画 */
  public void paint(Graphics g) {
   g.drawImage(image, 0, 0, imageSize.width, imageSize.height, this);
  }

  /** 一定時間でメインウィンドウとの表示を切り替えるためのスレッド */
  class SwitchingThread extends Thread {
   public void run() {
   // 3秒待つ
   try {
    sleep(3000);
   } catch (InterruptedException ex) {
    ex.printStackTrace();
   }
   // スプラッシュウィンドウをOFF
   setVisible(false);
   // メインウィンドウをON
   mainWindow.setVisible(true);
  }
 }
}


[ メッセージ編集済み 編集者: taka 編集日時 2004-01-20 10:16 ]
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-01-20 14:24
あるクラスのサブクラスを作成し、そのサブクラスのコンストラクタメソッドの
一行目に、super(XXX)等の「スーパークラスのコンストラクタ呼び出し」を記述
していない場合、コンパイラは暗黙のうちにsuper()「引数なしコンストラクタ
呼び出し」を挿入しようとします。


java.awt.Windowには引数なしコンストラクタが存在しない為、貼り付けられた
ソースをjava.awt.Windowのサブクラスに単純に変更すると、

public SplashWindow(Component mainWindow) {
//ここ
 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
 MediaTracker mt = new MediaTracker(this);
以下略

の位置でコンパイルエラーになります。
この位置にsuper(null);等の記述を追加して、コンパイルしてみてください。
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2004-01-20 15:17
シュンさんご意見ありがとうございました。

よくわかりました。

シュンさんからのアドバイスのように
super(null);
を入れるとコンパイルは通るのですが、実行すると
"java.lang.IllegalArgumentException: null owner window"
となりエラーとなりました。

そこで、super(new Cls_Main_Frame());とした所、問題なくできました。
下記は自作してみたスプラッシュクラスです。

public class Cls_SplashWindow extends Window{
 Image imgSplash;

 public Cls_SplashWindow() {
  super(new Main_Frame());//Main_Frameとはスプラッシュが消えた後に表示する画面です。
  //super(null);
  this.setSize(200,200);
  imgSplash = Toolkit.getDefaultToolkit().getImage("splash.gif");
  MediaTracker mt = new MediaTracker(this);
  mt.addImage(imgSplash, 0);
  try {
   mt.waitForAll();
  } catch (InterruptedException e) { e.printStackTrace(); }
 }

 /** 描画 */
 public void paint(Graphics g) {
  g.drawImage(imgSplash, 0, 0, 200, 200, this);
 }
 /**
 * スプラッシュウィンドウを表示
 */
 void showSplash(){
  this.show();
 }
 /**
 * スプラッシュウィンドウを非表示
 */
 void hideSplash() {
  this.hide();
 }
}
Arai
会議室デビュー日: 2004/01/20
投稿数: 8
投稿日時: 2004-01-20 21:39
Splash Screenとも言うみたいですね。
http://java.sun.com/products/jlf/ed2/book/HIG.Glossary.html#84900
1

スキルアップ/キャリアアップ(JOB@IT)