Nanashi-softソフトメニューJavaアプリケーション


◇Javaアプリケーション-ウィンドウをちゃんとする-

◎私はどうでも良いと思うが……

今までのサンプルで示したソースではウィンドウ表示が適当です
現に,点を打つを実行して,ウィンドウを少し広げてみると,そこにも点が描かれています
ソースのコメントに書いてあるように,タイトルや枠のサイズを気にせずにサイズを指定している為です
その程度の事,自分で調整すればいいじゃん。と私は思います

・ウィンドウの枠のサイズ
getInsetsメソッドでウィンドウの枠のサイズが取得出来ます
ですが……

    //ウィンドウ生成
    Frame app=new Frame();
    //枠のサイズを表示してみる
    System.out.println(app.getInsets().left);

としても「0」と表示されます

リファレンスを見ると,環境によってサイズが異なるので一度表示しなければ値は入らない,と記述されています
そこで,

    //ウィンドウ生成
    Frame app=new Frame();
    //ウィンドウ表示
    app.setVisible(true);
    //枠のサイズを表示してみる
    System.out.println(app.getInsets().left);

と表示してからサイズを取得すると「4」と表示されました

色々と試したところ,キャンバスはウィンドウ表示中には行えない,などの制限が色々あるので,今までと順番は変えない方がが良さそうでした

    //ウィンドウ生成
    Frame app=new Frame();
    //タイトル設定
    app.setTitle("Title");
    //ウィンドウを1回表示して再び消す
    app.setVisible(true);
    app.setVisible(false);
    //ウィンドウサイズ設定(タイトルや枠も含んだサイズ)
    app.setSize(240 + app.getInsets().left + app.getInsets().right, 240 + app.getInsets().top + app.getInsets().bottom);
    //キャンバスを配置
    fstCanvas cvs=new fstCanvas();
    app.add(cvs);
    //ウィンドウ表示
    app.setVisible(true);

こんな感じで,1回表示して消してみると色々な問題を回避できそうです

・ウィンドウを固定する
ゲームでウィンドウサイズを可変にする必要はありません。むしろ具合が悪い事がいっぱいです
setResizableメソッドを使ってサイズを固定する事ができます

    //ウィンドウサイズを固定する
    app.setResizable(false);

どこに記述しても構いません

・最小化ボタンを消す
ムリです
setUndecoratedメソッドで全部消す事はできますが,ウィンドウを動かす事も出来なくなるのでお薦めしません

どうしても最小化されるのが嫌なら,最小化ボタンを押しても終わるようにしておいてはどうでしょうか?

//ウィンドウに関するクラス
class WindowListener extends WindowAdapter{
  //ウィンドウの閉じるボタンをクリックされた
  public void windowClosing(WindowEvent e){
    System.exit(0);
  }
  //ウィンドウの最小化ボタンをクリックされた
  public void windowIconified(WindowEvent e){
    System.exit(0);
  }
}


・ウィンドウを中央に表示する
ムリです
そもそも Javaはプラットフォームに依存しない言語ですので,細かい制御を行えるようにはなっていないそうです
色々と見栄えを気にする人は,C言語で作って下さい

・ALT+F4でアプリが終了しないようにする
ムリです

・DOSウィンドウを消したい
ムリだろう

◎ソース

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

public class fst extends Frame{
  //裏画面用変数
  static int backimage[] = new int[240*240];
  //描画中フラグ
  static Boolean pflg=false;

  public static final void main(final String[] args){
    //ウィンドウ生成
    Frame app=new Frame();
    //タイトル設定
    app.setTitle("Title");
    //ウィンドウを1回表示して再び消す
    app.setVisible(true);
    app.setVisible(false);
    //ウィンドウサイズ設定(タイトルや枠も含んだサイズ)
    app.setSize(240 + app.getInsets().left + app.getInsets().right, 240 + app.getInsets().top + app.getInsets().bottom);
    //ウィンドウサイズを固定する
    app.setResizable(false);
    //ウィンドウメッセージ取得用設定
    WindowListener e=new WindowListener();
    app.addWindowListener(e);
    //キャンバスを配置
    fstCanvas cvs=new fstCanvas();
    app.add(cvs);
    //ウィンドウ表示
    app.setVisible(true);
    //60fps制御用変数初期化
    long t1 = System.currentTimeMillis();
    //無限ループ
    while (true){
      //描画チェックフラグが立っていなければ描画する
      if (pflg == false){
        //座標用変数
        int x, y;
        //カラー用変数
        int red, green, blue;

        //ランダムに座標を生成
        x = (int)(Math.random() * 240);
        y = (int)(Math.random() * 240);

        //ランダムにカラーを生成
        red = (int)(Math.random() * 256);
        green = (int)(Math.random() * 256);
        blue = (int)(Math.random() * 256);

        //裏画面に点を描画
        backimage[x + y*240] = 0xFF000000 + (red << 8) + (green << 4) + blue;

        //描画中フラグを立てる
        pflg = true;
        //画面再描画
        cvs.repaint();
        //60fpsになるようにウェイトを入れる
        while (t1 + 1000/60 < System.currentTimeMillis()){
        }
        //次のフレーム用の時間に進める
        t1 += 1000/60;
      }
    }
  }

  static class fstCanvas extends Canvas{
    public void paint(Graphics g){
      //描画中フラグが立っていたら処理する
      if (pflg == true){
        //裏画面を実画面にコピー
        g.drawImage(createImage(new MemoryImageSource(240,240,backimage,0,240)), 0, 0, this); 
        //描画中フラグをクリア
        pflg = false;
      }
    }

    //updateメソッドを乗っ取って,画面クリアを防ぐ
    public void update(Graphics g){
        paint(g);
    }
  }
}

//ウィンドウに関するクラス
class WindowListener extends WindowAdapter{
  //ウィンドウの閉じるボタンをクリックされた
  public void windowClosing(WindowEvent e){
    System.exit(0);
  }
  //ウィンドウの最小化ボタンをクリックされた
  public void windowIconified(WindowEvent e){
    System.exit(0);
  }
}



TOPプログラマ専用Javaアプリケーション