[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: Frameクラスで質問



いまいしです。

今石 正夫 wrote:

> Frameの使い方を勉強するためにちょっとしたものを
> 作ったんですが、MENUで「Quit」を選択しても終了
> してくれません。
>
> ちょっと長いですが、ソースを添付しますのでアドバイス
> 頂けたらうれしいです。

まずいところを見つけました。

>     public boolean handleEvent(Event e,Object arg){
>   if(e.id == Event.WINDOW_DESTROY){
>    System.exit(0) ;
>          return (true);
>      }
>   if(e.target instanceof MenuItem){
>          String txt=(String)arg;    //型変換
>          if(txt.equals("Quit"))     //もし"Quit"なら終了する
>                 System.exit(0);
>          return (true);
>   }
>   return false;
>  }

ここなんですが、下のようにする必要があるとのことです。
理由はよく分かりませんが、終了してくれるようになりました。

    public boolean handleEvent(Event e){
  if(e.id == Event.WINDOW_DESTROY){
   System.exit(0) ;
   return true ;
  }
 return super.handleEvent(e);
 }

    public boolean action(Event e,Object arg){
  if(e.target instanceof MenuItem){
         String txt=(String)arg;    //型変換
         if(txt.equals("Quit"))     //もし"Quit"なら終了する
                System.exit(0);
         return (true);
  }
  return true;

ポイントは
・Event.WINDOW_DESTROYはhandleEventで
 メニュー関連はactionで
 というふうに分ける。
・handleEventの返り値を
  return super.handleEvent(e)
 にする。
といったところです。

修正したソースを添付します。
 java.awt.event.WindowListenerを使った場合を教えてもらえると
ありがたいです>遠藤さん


-----------------------------------------------------
import java.awt.*;

/** 数字のボタンを配置する NumberFrame クラス */
 public class NumberFrame2 extends Frame{
 MenuBar mb;
 Menu m;
 MenuItem mi;

    /** 起動時に呼び出されるメソッド */
 public static void main( String argv[] ) {
  NumberFrame2 window = new  NumberFrame2() ;
        window.setTitle("Number Frame");
  window.pack();
  window.show();
 }

 NumberFrame2(){
  int MAX_NUM = 12;
  mb=new MenuBar();
  m=new Menu("File");
  mi=new MenuItem("Quit");
  m.add(mi);     //メニューにメニューアイテムをつける
  mb.add(m);     //メニューバーにメニューをつける

  Panel panel = new Panel();                  //パネルの生成
  NumberCanvas canvas = new NumberCanvas();   //キャンバスの生成

  GridLayout lay = new GridLayout( 4, 3 );    //レイアウトの生成
  panel.setLayout( lay );         //レイアウトの設定

  Color color = new Color( 250, 250, 240 );
  Font buttonFont = new Font( "TimesRoman", Font.BOLD, 36 );
  Font canvasFont = new Font( "TimesRoman", Font.PLAIN, 36 );

  panel.setBackground( color );
  canvas.setBackground( Color.black );
  canvas.setFont( canvasFont );

  NumberButton buttons[];
  buttons = new NumberButton[MAX_NUM];     //ボタンの生成
  for( int i=0; i<10; i++ )
       buttons[i] =
  new NumberButton( canvas, new Integer(i).toString() );
  buttons[10] = new NumberButton( canvas, "." );
  buttons[11] = new NumberButton( canvas, "=" );
  for( int i=0; i<MAX_NUM; i++ ) {
            buttons[i].setBackground( color );
            buttons[i].setForeground( Color.black );
            buttons[i].setFont( buttonFont );
            panel.add( buttons[i] );
  }

  canvas.resize( 300, 40 );
  add( "North", canvas );
  panel.resize( 300, 400 );
  add( "Center", panel );
  setMenuBar(mb);

 }

    public boolean handleEvent(Event e){
  if(e.id == Event.WINDOW_DESTROY){
   System.exit(0) ;
   return true ;
  }
  return super.handleEvent(e);
 }

    public boolean action(Event e,Object arg){
  if(e.target instanceof MenuItem){
         String txt=(String)arg;    //型変換
         if(txt.equals("Quit"))     //もし"Quit"なら終了する
                System.exit(0);
         return (true);
  }
  return true;
 }

} // NumberFrameクラスの定義の終わり


/** 数字を表示する NumberCavas クラス */
class NumberCanvas extends Canvas {

   /** 表示したい文字列を記憶するバッファ */
 protected StringBuffer numberString;

   /** コンストラクタ */
 NumberCanvas(){
     super();  // Canvas のコンストラクタ
     numberString = new StringBuffer(" ");
    }

 /** 描画のメソッド */
 public void paint( Graphics g ) {
  g.setColor( Color.green );
  g.drawString( numberString.toString(), 4, 34 );
 }

 /** 文字列の設定のメソッド */

 public void setNumberString( String str ) {
  numberString.insert( 0, str );
  numberString.setLength( str.length() );
 }
} // NumberCanvasクラスの定義の終わり


/** 数字を選択する NumberButton クラス */
class NumberButton extends Button {

 /** 描画したいキャンバス */
 public NumberCanvas canvas;

 /** コンストラクタ */

 NumberButton( NumberCanvas canvas, String str ){
  super( str );  // Button のコンストラクタ
  this.canvas = canvas;
 }

 /** アクション処理のメソッド */
 public boolean action( Event event, Object object ) {
  canvas.setNumberString( object.toString() );
  canvas.repaint();
  return true;
 }
} // NumberButtonクラスの定義の終わり
------------------------------------------------