- ベストアンサー
Javaスロット - ボタンj1を押すとエラーが起こる
- java スロットのプログラムで、ボタンj1を押すとエラーが発生し、プログラムが停止します。
- ラベルtlの数字だけを停止させるために、ボタンj1を使用しています。
- 要約文を生成する方法やハッシュタグの考え方を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
import java.awt.Button; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Label; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Random; public class AWT extends Frame{ int i=0; String str; Button j1; TL tl; // とりあえず便宜的に、ここの変数はグローバル変数と呼称します。 // 下記「i2、pending」はグローバルで定義しては いけません。 // 「i2」は競合している(値が破壊される可能性がある)ので // ローカルにしなければなしませんし、 // 「pending」もローカルにしなければなしません。 //int i2=0; //boolean pending=false; public AWT(){ super(); this.setSize(800,700); j1=new Button("AWT"); j1.addActionListener(new MyButtonActionAdapter()); Button j2=new Button("AWT2"); Button j3=new Button("AWT3"); this.addWindowListener(new WA()); this.setVisible(true); this.setLayout(new GridLayout(2,3)); tl =new TL(1); this.add(tl); TL tl2=new TL(10); this.add(tl2); TL tl3=new TL(30); this.add(tl3); this.add(j1); this.add(j2); this.add(j3); } public static void main(String[] args){ AWT test=new AWT(); test.validate(); } class WA extends WindowAdapter{ public void windowClosing(WindowEvent ev){ System.exit(0); } }/*class WAの終わり*/ class TL extends Label implements Runnable{ // volatile:最適化の抑制. // この場合、「pending」が外部的要因で変更されるので、 // 「volatile:最適化の抑制」が必要です。 // (処理の高速化のために)ループ内の変数は最適化によりレジスターのみで処理され // 変数のメモリー領域はアクセスされなくなる場合があります。 // 「volatile:最適化の抑制」により そのような問題を回避できます。 volatile boolean pending=false; int i2=0; Random rnd = new Random(); Thread th; TL(long seed){ this.setText("count" ); this.setFont(new Font("SansSerif",Font.BOLD,18)); this.setForeground(Color.blue); rnd.setSeed(seed); th = new Thread(this); // ↑ちゃんと変数に保存しておかないとガーベージ・コレクションされかねません。 // 確かに、このように記述されているサイトも有るかもしれませんが、ダメな例です。 // AWT コンポーネントの「add(~)」や、Listener とかは、 // ちゃんと内部的に登録(保存)されているので変数に保存しなくても // ガーベージ・コレクションされません。 th.start(); } public void run(){ while(true){ i2=rnd.nextInt(3)+1; this.setText(String.valueOf(i2)); try{ Thread.sleep(600); // ↑少し早くしています。 if(pending){ synchronized(this){ // 「wait()」は「synchronized」で囲わないと Exception が発生します。 // 「synchronized」は「this」が基本ですが、本質は排他制御ですので、 // いかに正しい排他制御をするかと言う事が肝要なので、 // 「this」以外を指定しなければならない場合も有ります。 wait(); } } }catch(InterruptedException e){ e.printStackTrace(); }finally{ } } }/*runの終わり*/ public synchronized void setpending(boolean f){ pending=f; // 「wait()」から抜けるには「notify()」が必要です。 if( ! pending){ this.notify(); } } }/*class TLの終わり*/ class MyButtonActionAdapter implements ActionListener{ public void actionPerformed(ActionEvent ev){ tl.setpending( ! tl.pending); // ↑否定の場合は空白を入れたほうが分かりやすいです。 if(tl.pending){ j1.setLabel("Pending"); }else{ j1.setLabel("Running"); } } }/*class MY・・・の終わり*/ }/* class AWTの終わり*/
その他の回答 (3)
- amanojaku1
- ベストアンサー率54% (265/488)
少々、ハードルが高いですが、Android Java なんて どうでしょうか? Android 端末さえあれば自分の作ったプログラムを人に見せびらかせられるのでモチベーションが上がるんじゃないでしょうか? ただし、みんなが普段 使ってるような「アプリ、ゲーム」などと比べて雲泥の差でショボイので、あまり良い反応は得られない場合が多々あるかもしれませんけど…。 ただし、普通の Java とは API が全く別物なので WEB で検索して勉強し下さい。
お礼
お返事ありがとうございます。自分の知識の低さがわかりました。
- amanojaku1
- ベストアンサー率54% (265/488)
> // 確かに、このように記述されているサイトも有るかもしれませんが、ダメな例です。 new Thread(this).start(); ↑確かに、このように記述されているサイトも有るかもしれませんが、これはダメな例です。
お礼
スレッド処理の指導ありがとうございます。
- amanojaku1
- ベストアンサー率54% (265/488)
test.validate(); ↑良く分かりませんが、この「test.validate()」は必要ないかと…。 ちなみに現在、AWT コンポーネントではなく、Swing コンポーネントが推奨されています。 なお、Swing コンポーネントには Canvas は存在しないので、JPanel で代用しなければなりません。
お礼
技術的な説明、ありがとうございます。
お礼
javaのプログラム、ありがとうございます。