質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

Q&A

解決済

4回答

1835閲覧

コンストラクタが処理されません

OMDM1991

総合スコア25

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

0グッド

0クリップ

投稿2015/06/08 12:28

###実現したいこと
ボタンを押すとHello Worldが10回表示されて終了するソースコードを書きたいです。
###発生している問題
動かしてボタンを押してみると、"ボタンクリック確認"は表示されるのですがUの値やHello Worldは表示されません。
恐らく、public void paint(Graphics g)のコンストラクタが動作していないのだと思います。
何故動作しないのか・どう改善すれば良いのか教えてください。
###ソースコード

lang

1import java.awt.*; 2import java.awt.event.*; 3import java.awt.Graphics.*; 4 5public class ButtonTest extends Frame { 6 public static void main(String [] args) { 7 new ButtonTest(); 8 } 9 ButtonTest() { 10 super("ButtonTest"); 11 setSize(400, 200); 12 setLayout(new FlowLayout()); 13 Button b1 = new Button("OK"); 14 b1.addActionListener(new MyActionListener()); 15 add(b1); 16 show(); 17 } 18 19 class MyActionListener implements ActionListener { 20 private int U = 0; 21 public void actionPerformed(ActionEvent e){ 22System.out.println("ボタンクリック確認"); 23 U = 1; 24 } 25 26 public void paint(Graphics g){ 27System.out.println(U); 28 if(U == 1){ 29 String str; 30 str = "Hello World"; 31 int Y = 50; 32 try{ 33 for(int a=1; a<=10; a++){ 34 g.drawString(str, 20, Y); 35 Thread.sleep(100); 36 Y = Y + 10; 37 } 38 } 39 catch(InterruptedException b){} 40 } 41 else{} 42 System.out.println("処理を終了します"); 43 System.exit(0); 44 } 45 } 46}

###補足情報(言語/FW/ツール等のバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

こんばんわ
今まで回答に出ている通りですが処理の流れは。。。
1:main実行
2:ButtonTestコンストラクタ初期化
3:とりあえずボタン押す
4:ボタンにセットしているリスナーのactionPerformed(e)が動く
5:ボタンをクリックしました表示して終了

修正ポイントは。。。
1:HellowWorld10回表示をactionPerformed(e)の中に移動
2:HellowWorld10回表示をやった後repaint();で再描画
3:System.exit(0);を消す

とりあえず載せてあるそーすから抜粋して一部書き換え、手前の環境で動くものを作ってみたので載せます
参考程度にどうぞ

実行環境:Java1.6

import java.awt.;
import java.awt.event.
;
import java.awt.image.BufferedImage;
import javax.swing.JApplet;

@SuppressWarnings("serial")
public class ButtonTest extends JApplet {

//描画領域 Image image; //描画内容 Graphics g; public static void main(String[] args) { new ButtonTest(); } public ButtonTest() { //画面の縦横サイズをセット setSize(400, 400); //描画領域を確保 image = new BufferedImage(getHeight(), getWidth(), BufferedImage.TYPE_INT_ARGB); //描画内容はとりあえず白紙にする(初期化) g = image.getGraphics(); //画面自体を中央寄せにする setLayout(new FlowLayout()); //ボタン初期化 Button b1 = new Button("OK"); //ボタンにリスナー(ボタンの振る舞い)を追加 b1.addActionListener(new MyActionListener()); //画面にボタンを追加 add(b1); } //リスナー(ボタンの振る舞い)を定義 class MyActionListener implements ActionListener { //ボタンを押した時の動きを定義する public void actionPerformed(ActionEvent e) { System.out.println("ボタンクリック確認"); //HelloWorld 10回表示!!! String str = "Hello World"; int Y = 50; try { for (int a = 1; a <= 10; a++) { g.setColor(Color.BLACK); g.drawString(str, 20, Y); Y = Y + 10; } } catch (Exception b) { b.printStackTrace(); } //再描画 repaint(); System.out.println("処理を終了します"); //これあると画面消えちゃうよ

// System.exit(0);
}

} //描画内容を描画領域に描く public void paint(Graphics g) { g.drawImage(image, 0, 0, null); }

}

投稿2015/06/08 14:34

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OMDM1991

2015/06/09 11:55

親切な解答ありがとうございます。 "実現したいこと"に不備がありました。ボタンを押すとHello Worldが0.1秒おきに10回表示されて終了するソースコードを書きたいのですが、書いてくださったソースコードの for (int a = 1; a <= 10; a++) { g.setColor(Color.BLACK); g.drawString(str, 20, Y); Y = Y + 10; } を for (int a = 1; a <= 10; a++) { g.setColor(Color.BLACK); g.drawString(str, 20, Y); repaint(); Y = Y + 10; Thread.sleep(100); } と書き直して実行しても、1秒経過してからHello Worldが10個一気に表示されるのですが、どう書き直せばいいでしょうか?
退会済みユーザー

退会済みユーザー

2015/06/09 16:17

こんばんわ 普通に動きそうですが、いざやってみて同じ結果になりましたorz ネットで参考になりそうなページを見つけたので読んでみてはどうでしょうか http://stackoverflow.com/questions/16498174/thread-sleep-in-actionperformed 要するに使えませんよ残念。。。ってところですか
退会済みユーザー

退会済みユーザー

2015/06/09 16:20

ということで代わりに使えと書いてあるTimerを使ってサンプルを作ってみました おそらくですが実現したいことに近い動きだと思います 実行環境:Java1.6 import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.util.TimerTask; import java.util.Timer; import javax.swing.JApplet; @SuppressWarnings("serial") public class ButtonTest extends JApplet { //描画領域 Image image; //描画内容 Graphics2D g; //タイマー Timer timer; //HelloWorld位置 int w = 20; int h = 50; public static void main(String[] args) { new ButtonTest(); } public ButtonTest() { //画面の縦横サイズをセット setSize(400, 400); //描画領域を確保 image = new BufferedImage(getHeight(), getWidth(), BufferedImage.TYPE_INT_ARGB); //描画内容はとりあえず白紙にする(初期化) g = (Graphics2D) image.getGraphics(); //画面自体を中央寄せにする setLayout(new FlowLayout()); //ボタン初期化 Button b1 = new Button("OK"); //ボタンにリスナー(ボタンの振る舞い)を追加 b1.addActionListener(new MyActionListener()); //画面にボタンを追加 add(b1); } //リスナー(ボタンの振る舞い)を定義 class MyActionListener implements ActionListener { //ボタンを押した時の動きを定義する public void actionPerformed(ActionEvent e) { System.out.println("ボタンクリック確認"); //HelloWorld 10回表示!!! //を1秒間隔で動かすタイマーを定義 timer = new Timer(); PrintHello ph = new PrintHello(); timer.schedule(ph, 1000, 1000); System.out.println("処理を終了します"); //これあると画面消えちゃうよ // System.exit(0); } } //描画内容を描画領域に描く public void paint(Graphics g) { g.drawImage(image, 0, 0, null); } //HelloWorldを指定位置に表示する //(TimerTaskを継承して一定時間ごとに繰り返す処理に変身!!) public class PrintHello extends TimerTask{ @Override public void run(){ String str = "Hello World"; try { //10回(条件はイマイチですが。。。)繰り返して〜 //タイマー実行タスクを終わる if(h == 185){ timer.cancel(); setEnabled(false); }else{ //これが無いと同じ行に複数回出力して文字が太くなる。。。 g.setBackground(Color.WHITE); g.clearRect(w, h-15, getWidth(), getHeight()); } g.setColor(Color.BLACK); g.drawString(str, w, h); repaint(); h += 15; } catch (Exception b) { b.printStackTrace(); } } } }
guest

0

paintメソッドは、コンポーネントのpaintメソッドをオーバーライドしないといけません。この場合だと、Frameを継承したButtonTestでオーバーライドするのが簡単でしょう。
そして、ボタンが押された時に(actionPerformの中で)repaintを呼んであげれば、paintが実行されます。

それと、System.exit(0)がif文の外にあるので、おそらく再描画されるとボタンが押されていなくても終了してしまいます。

最後に、これは余計なお世話だと思いますが、今から勉強するならAWTではなくてSwingの方を選んだ方が良いと思います。

投稿2015/06/08 13:21

編集2015/06/08 13:30
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

class MyActionListener implements ActionListener {
public void paint(Graphics g){
}
}

paintを呼ぶ記述がないからじゃないですか?

再描画要求をだして、MyActionListener.paint() しないと呼ばれないと思います。

そもそも MyActionListener にペイントを置くのではなくButtonTest におく方が良いと思いましたけど・・・。

投稿2015/06/08 12:59

MasaakiIrie

総合スコア1021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

実際に描写処理を行うpaintメソッドをどこからも呼んでいないためです.
actionPerformedのU=1のあとでpaintメソッドを起動して下さい.

投稿2015/06/08 12:58

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問