Javaスロット - ボタンj1を押すとエラーが起こる

このQ&Aのポイント
  • java スロットのプログラムで、ボタンj1を押すとエラーが発生し、プログラムが停止します。
  • ラベルtlの数字だけを停止させるために、ボタンj1を使用しています。
  • 要約文を生成する方法やハッシュタグの考え方を教えてください。
回答を見る
  • ベストアンサー

java スロット

ボタンj1を押すと、ラベルtlの数字だけを停止させるようにし、tl2,tl3は数字を表示したい のですが、 現在ボタンj1を押すと、Exception in thread "Thread-2" Exception in thread "Thread-4" java.lang.IllegalMonitorStateException・・・と例外が発生し、プログラムが停止します。 以下がプログラムです。 import java.awt.*; import java.awt.event.*; import java.util.*; public class AWT extends Frame{ int i=0; String str; Button j1; int i2=0; TL tl; 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{ Random rnd = new Random(); TL(long seed){ this.setText("count" ); this.setFont(new Font("SansSerif",Font.BOLD,18)); this.setForeground(Color.blue); rnd.setSeed(seed); new Thread(this).start(); } public void run(){ while(true){ i2=rnd.nextInt(3)+1; this.setText(String.valueOf(i2)); try{ Thread.sleep(1000); if(pending){ wait(); } }catch(InterruptedException e){ e.printStackTrace(); }finally{ } } }/*runの終わり*/ public synchronized void setpending(boolean f){ pending=f; } }/*class TLの終わり*/ class MyButtonActionAdapter implements ActionListener{ public void actionPerformed(ActionEvent ev){ j1.setLabel("CLICKED"); tl.setpending(!pending); } }/*class MY・・・の終わり*/ }/* class AWTの終わり*/ ご指導お願いします。

  • Java
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

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の終わり*/

situmonn9876
質問者

お礼

javaのプログラム、ありがとうございます。

その他の回答 (3)

回答No.4

少々、ハードルが高いですが、Android Java なんて どうでしょうか? Android 端末さえあれば自分の作ったプログラムを人に見せびらかせられるのでモチベーションが上がるんじゃないでしょうか? ただし、みんなが普段 使ってるような「アプリ、ゲーム」などと比べて雲泥の差でショボイので、あまり良い反応は得られない場合が多々あるかもしれませんけど…。 ただし、普通の Java とは API が全く別物なので WEB で検索して勉強し下さい。

situmonn9876
質問者

お礼

お返事ありがとうございます。自分の知識の低さがわかりました。

回答No.3

> // 確かに、このように記述されているサイトも有るかもしれませんが、ダメな例です。 new Thread(this).start(); ↑確かに、このように記述されているサイトも有るかもしれませんが、これはダメな例です。

situmonn9876
質問者

お礼

スレッド処理の指導ありがとうございます。

回答No.2

test.validate(); ↑良く分かりませんが、この「test.validate()」は必要ないかと…。 ちなみに現在、AWT コンポーネントではなく、Swing コンポーネントが推奨されています。 なお、Swing コンポーネントには Canvas は存在しないので、JPanel で代用しなければなりません。

situmonn9876
質問者

お礼

技術的な説明、ありがとうございます。

関連するQ&A

  • Javaアプレットについてですが

    Javaアプレットでボタンを押したら数字が増えるものを作っているのですがどうもうまく動きません。 ソースは下の通りです。 変更しなければいけないところがあるならお願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample7 extends Applet implements Runnable, ActionListener { Button bt; int num; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); Thread th; th = new Thread(this); th.start(); } public void actionPerformed(ActionEvent ae) { public void run() { try{ for(int i=0; i<11; i++){ num = i; repaint(); Thread.sleep(1000); } } catch(InterruptedException e){} } } public void paint(Graphics g) { String str = num + "です。"; g.drawString(str, 50, 50); } }

    • ベストアンサー
    • Java
  • java アプレット

    学校の授業でアプレットを学んでいます。 しかし・・・ 下のプログラムで、計算した結果をlabel3にはりつけたいのですが、計算結果がでてくれません・・・ボタンを押しても何もでてきません。 コマンドプロンプトで、エラーはでてきません。 お手数ですが、誰かどこがいけないのか教えて下さい。 import java.awt.*; import java.awt.event.*; public class B extends java.applet.Applet implements ActionListener { Label label3 = new Label(); Button button2 = new Button(); TextField textfield1= new TextField(10); TextField textfield2= new TextField(10); public void init() { button2.setLabel("入力したらクリック!"); button2.setBounds(new Rectangle(50, 465, 120, 20)); this.setLayout(null); label3.setBackground(Color.blue); label3.setBounds(new Rectangle(325, 80, 200, 35)); textfield1.setBounds(100, 425, 100, 25); textfield2.setBounds(150, 350, 100, 25); this.add(textfield2, null); this.add(label3, null); this.add(textfield1, null); this.add(button2, null);} public void actionPerformed(ActionEvent event) {if(event.getSource() == button2) {int diff = Integer.parseInt(textfield1.getText()) - Integer.parseInt(textfield2.getText()); String otsuri; otsuri ="お釣りは"+ diff +"円です。"; label3.setText(otsuri);} }} よろしくお願いします。

    • ベストアンサー
    • Java
  • java applet

    import java. applet.*; import java. awt. Button; import java. awt. Label; import java. awt. TextField; import java. awt. event.*; public class 1120 extends Applet implements ActionListener { private TextField box1 = new TextField(5); private TextField box2 = new TextField(5); private TextField box3 = new TextField(5); private Label moji1 = new Label(" と "); private Label moji2 = new Label(" の和は "); private Label moji3 = new Label(" である。 "); private Button ok = new Button("OK"); public void init() { resize( 320 , 240); add( box1 ); add( moji1 ); add( box2 ); add( moji2 ); add( box3 ); add( moji3 ); add( ok ); ok.addActionListener( this ); } public void actionPerformed( ActionEvent e ) { int i=0 ,j =0 , k; String t1 = box1.getText(); String t2 = box2.getText(); i = Integer.parseInt( t1 ); j = Integer.parseInt( t2 ); k = i + j; String s = Integer.toString( k ); box3. setText( s ); } } //上記のプログラムを書いたのですが、なぜかエラーが出てしまいます。勿論、自分でも見直しましたが、その理由がわかりませんでした。知識のある方、ご回答の方お願いします。

  • JAVAのプログラミングについて

    色変更というボタンを押すたびに、正方形の中の色が緑から青、青から緑というように繰り返し色が変わるプログラムを作りたいのですが、途中までは、完成できたのですが、ここからどうすればいいかわかりません。教えてください。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class kadai3Applet extends Applet implements ActionListener { int i = 1; Button collor; public void init(){ collor = new Button("色変更"); collor.addActionListener(this); add(collor); } public void paint(Graphics g){ g.setColor(Color.green); g.fillRect(50,50,50,50); } public void actionPerformed(ActionEvent e){ if(e.getSource() == collor){ } repaint(); } }

  • コンポーネントの組み込みについて

    アプレットでもAWTアプリでもSwingアプリでもなんでもいいんですが、 特定の条件を満たした時に、はじめは表示されていないボタンやテキストフィールドなどを後から表示させたいのですが、できません。 単純にadd()ではできないようで… やり方を教えていただけませんか。。 下は、10秒後にボタンが表示されるように自分で作ってみたサンプルアプレットです。 //<applet code="buttonsample.class" width=300 height=200></applet> import java.applet.*; import java.awt.*; import java.awt.event.*; public class buttonsample extends Applet implements Runnable { int count; //カウント Thread th; //スレッド Button BT; //ボタン public void init() { setLayout(new FlowLayout()); count = 0; BT = new Button(); BT.setLabel("ボタン"); } public void start() { if(th == null) { th = new Thread(this); th.start(); } } public void stop() { th = null; } public void run() { while(count < 10) { repaint(); count++; try { Thread.sleep(1000); } catch(InterruptedException e){} } add(BT); } public void paint(Graphics g) { g.drawString(""+(count+1),100,100); } } <EOS>

    • ベストアンサー
    • Java
  • Javaのメモリ・リークについて

    Javaのメモリ・リークについて 以下のコードはスレッド内で、無限ループをしています。 コンストラクタで呼び出し、ずっとこのままにしておいてもフリーズするか否かが知りたいです。 (jconsole.jarというツールがありますが、まだ理解に至っておりません。) ご存知の方がおられましたら教えてください。 よろしくお願いいたします。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class ActioneventRoopTest extends JFrame implements Runnable, ActionListener { JButton start = new JButton(); JButton change = new JButton("切り替え"); Boolean flag = true; public static void main(String[] args) { new ActioneventRoopTest(); } public ActioneventRoopTest() { change.addActionListener(this); start.addActionListener(this); this.add(change); this.pack(); this.setVisible(true); Thread thread = new Thread(this); thread.start(); } public void actionPerformed(ActionEvent e) { if (e.getSource() == change) { if (flag) { flag = false; } else if (!flag) { flag = true; } } } public void run() { while (true) { while (flag) { System.out.println("リンゴ"); } while (!flag) { System.out.println("ミカン"); } } } }

    • ベストアンサー
    • Java
  • javaのmainの中のループに割込を掛ける

    毎度、お世話になります。 javaのmainの中のループに割込を掛ける方法をお教えください。 添付コードの『Thread.currentThread().interrup()』は、旨く機能しません。 以上、宜しくお願いします。 =========== import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class T_try_loop extends JFrame{ JFrame frame=new JFrame(); T_try_loop(){ System.out.println("aaaa"); JPanel p1=new JPanel(); JButton button1=new JButton("button1"); button1.addActionListener(new TimButton1()); p1.add(button1); getContentPane().add(p1, BorderLayout.CENTER); } public static void main(String args[]){ T_try_loop frame=new T_try_loop(); frame.setTitle("TTTT"); frame.setBounds(10,10,400,300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); for(int j = 0;j < 80; j++){ try{ Thread.sleep(80); System.out.print("*"); } catch(InterruptedException e){ System.out.println(": main_loopに、今割り込まれました"); } } }//public static void main public class TimButton1 implements ActionListener{ @Override public void actionPerformed(ActionEvent ae){ String cmd =ae.getActionCommand(); if(cmd.equals("button1")){ Thread.currentThread().interrupt(); System.out.println("Button clicked"); } } }//public class TimButton1 }

    • ベストアンサー
    • Java
  • カレンダーを作っているのですが

    import java.awt.*; import java.awt.event.*; public class GraphicsC4 extends Frame { public static void main(String ar[]){ Frame f=new GraphicsC4(); f.setTitle ("平成19年6月 (GridLayout)"); f.setSize(640,400); f.setVisible(true); } GraphicsC4(){ setFont(new Font("SansSerif",Font.BOLD+Font.ITALIC,30)); GridLayout gl=new GridLayout(6,7); setLayout(gl); String day[]={"SUN","MON","TUE","WED","THU","FRI","SAT"}; for(int j=0;j<=6;j++){ Button b1=new Button(day[j]); add(b1); } for(int e=1;e<=5;e++){ Button b2=new Button(""); add(b2); } for(int i=1;i<=30;i++){ Button b3=new Button(""+i+""); add(b3); } addWindowListener(new WinAdapter()); } class WinAdapter extends WindowAdapter{ public void windowClosing(WindowEvent we){System.exit(0);} } } ここまで書いたのですが、日曜日を赤く表示することが出来ません。どなたか教えてください。

  • アクションリスナー(初心者です)

    JAVAでボタンが押されたらすでに描かれている線に さらに線が加わって描かれるというプログラムを作ろうとしているのですが、アクションリスナーを受け取ったメソッドの中身をどうしたらいいのか行き詰まりました・・・作りかけのプログラムを載せてみますので アドバイスいただければと思います よろしくお願いします import java.applet.Applet; import java.awt.Graphics.*; import java.awt.event.*; import java.awt.*; public class file928 extends Applet implements ActionListener { Button botan; public void init() { botan=new Button("選択"); add(botan); botan.addActionListener(this); } public void paint(Graphics g) { g.drawString("L.A.Airport",100,300);           ~中略~ g.drawLine(405,420,655,240); } public void actionPerformed(ActionEvent x) { ーここをどうしたらいいかわかりません・・・ー } }

    • ベストアンサー
    • Java
  • javaにおいてコンパイルをすると次のようなエラーが出てきます。

    javaにおいてコンパイルをすると次のようなエラーが出てきます。 力不足で解決することができません。 どうか力を貸してください。 エラーは以下のように出てきます。 よろしくお願いします。 シンボルがみつかりません シンボル: コンストラクタ DrawPanelMouseHandler(DrawPanel) 場所 : DrawPanelMouseHandler の クラス mouseHandler = new DrawPanelMouseHandler(this); mouseHandler = new DrawPanelMouseHandler(this);import java.awt.*; import java.util.ArrayList; import javax.swing.JPanel; import javax.swing.JButton; public class DrawPanel extends JPanel { ArrayList<Shape> shapeList = new ArrayList<Shape>(); DrawPanelMouseHandler mouseHandler; public void paintComponent(Graphics g) { super.paintComponent(g); for(Shape shape: shapeList){ shape.draw(g); } } public DrawPanel(){ mouseHandler = new DrawPanelMouseHandler(this); this.addMouseListener(mouseHandler); this.addMouseMotionListener(mouseHandler); ShapeFactory circleFactory = new CircleFactory(); UIToolButton circleButton = new UIToolButton(circleFactory, this, "Circle"); this.add(circleButton); } public void addShape(Shape s) { shapeList.add(s); repaint(); } } import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class UIToolButton extends JButton implements ActionListener{ DrawPanelMouseHandler mouseHandler; ShapeFactory factory; public UIToolButton(ShapeFactory factory, DrawPanelMouseHandler mouseHandler, String text) { super(text); this.addActionListener(this); this.mouseHandler = mouseHandler; this.factory = factory; } public void actionPerformed (ActionEvent ae) { mouseHandler.setShapeFactory(factory); } }

専門家に質問してみよう