怒りのJava学習 このページをアンテナに追加 RSSフィード

Java初心者が
Java学習の途中で感じた怒りを
叩きつけるブログ

 このブログでは
※コンパイルエラーの99%は入力ミスで出来ています
※コンパイルエラーの1%は故意の省略で出来ています

現在皆様のエラー例を募集中



↓このブログの執筆方針
はじめに

↓ブログランキングへのリンク

クリックでランキングのポイントが加算される
今のところどうでもいい

2007-05-25 コンパイラーもgoogleを見習って「もしかして」をやってくれ

[]2:閉じない


 Javaアプリケーションで出力したウインドウの右上の×ボタンを押したが、ウインドウが閉じない。ソースはこうである。コンパイルエラーは無し。原因はなにか?

【省略】
class window81 extends Frame{
  public static void main(String[] args){
    Frame win = new window81();
    win.setSize(450,280);win.setVisible(true);
    win.addWindowListener(new WindowAdapter(){
      public void windowCloseing(WindowEvent evt){
        System.exit(0);
      }
    });
  }
}

2007-05-24 現在バグつぶしで格闘中

[]コンパイル時&ウインドウ表示異常

f:id:java1rou:20070527192603g:image

 以下のように書くと上図のような結果になる。原因が分からん!(探索中)。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class cmcctest1
  public static void main(String[] args){
  mWindow mW = new mWindow();
  }
}

class mWindow extends JFrame implements MouseListener{
  int r = 20;
  public mWindow(){
    setSize(300,200);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.addMouseListener(this);
    show();
  }
  public void paint(Graphics g){
  }
  public void mousePressed(MouseEvent e ){
  }
  public void mouseReleased(MouseEvent e ){
  }
  public void mouseClicked(MouseEvent e ){
    Graphics g = getGraphics();
    g.setColor(new Color(0,0,0));
    g.drawOval(e.getX()-r,e.getY()-r,r*2,r*2);
    g.dispose();
  }
  public void mouseEntered(MouseEvent e ){
  }
  public void mouseExited(MouseEvent e ){
  }
}

 これを実行するとウィンドウが表示されるのはいいが、ウインドウの中身が描画されず、背後の画像をそのまま載せたまま(上図参照)、ウインドウの移動とともに持っていってしまう。

実はマウスリスナーは実装していないのでマウスイベントを全部削除してみる。すると正常に戻った(ウインドウの中が灰色になった。)で、削除したマウスイベントを元に戻してやると、今度は異常が起こらない。

 訳が分からない。呪われているのだろうか?

 しかもmWindowクラスにマウスリスナーを実装(extends JFrame の後ろにimplements MouseLisetnerを追加)したにもかかわらずマウスイベント処理のメソッドを全削除しても通常通り作動する。(下図↓)

f:id:java1rou:20070524111548p:image

おかしい。

 そこでフォルダを開いて見ると、mWindowクラスとmWindow$1(無名クラス?)クラスがコンパイルされて出来ていた。mWindowクラスだけを削除し、JCPadで三角ボタンを押す(コンパイル&実行)とcmccクラスは変更していないにもかかわらず黒窓から”mainスレッドにクラスが無い”というエラーが返ってきて動作が停止した。

 ここから考えられる事は、JCPadはファイル名と同じ名前のクラスの更新だけをチェックして、ソース上で併記されたクラス(ここではmWindowクラス)の変更はチェックしていないということだ。ファイル名と同じ名前のクラスに更新があった時のみまとめてコンパイルを行い、(つまりこの時だけ併記クラスのコンパイルを行う)、更新がない時は併記クラスにどんな変更があろうとも無視する。よって併記クラスの古いクラスファイルは保存されているので正常に作動するのだろう。

 しかしそれが分かったところでウインドウの異常表示は解消されない・・・。原因も不明・・・。JCPadが悪いのか、Javaが悪いのか、それともオレが悪いのか分からん。この怒りをどこにぶつけりゃいいんじゃァァァァァァァッ!!!!


追記:

 なお、正常作動したと思っていたが、ちょっといじってから再度コンパイルすると異常表示に逆戻り。「編集」→「元に戻す」→「コンパイル&実行」でも何が原因なのかも分からず仕舞い。

 タスケテー。