こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

またまたすいません、Javaについて質問です

閲覧ありがとうございます。
現在Javaで簡単なお絵描きソフトを作成しているのですが、ResetButtonを押すと
画面をクリアしたいのですが、ResetButtonを押すと画面はクリアしますが、何故か
左上にResetButtonが描画されてしまいます・・・何故でしょうか?

ソースは以下の通りです。(また文字数制限に引っかかったので、一部省略してかいてあります。)

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

/*+++ メインクラス +++*/
public class java_test_04 extends JFrame
implements ActionListener {

int x1, y1;//描画始点
int x2, y2;//描画次点

MyPanel mp = new MyPanel();//マイパネルを作成
JButton resetButton = new JButton("Reset");//リセットボタンを作成
Dimension size;

public static void main(String[] args) {
new java_test_04();
}

public java_test_04() {
setLayout(null);
setTitle("お絵かき");//フレームタイトルを設定
setSize(400, 400);//フレームサイズを設定

/*+++ リセットボタンの設定 +++*/
resetButton.setBounds(0, 300, 70, 25);//リセットボタンの表示座標・サイズを設定
resetButton.addActionListener(this);//リセットボタンにアクションイベントを追加
getContentPane().add(resetButton);//リセットボタンを追加

/*+++ マイパネルの設定 +++*/
size = Toolkit.
getDefaultToolkit().
getScreenSize();//フレームのサイズを取得
mp.setBackground(Color.red);//マイパネルの背景色を青に
mp.setBounds(0, 0, size.width, 250);//マイパネルの表示座標・サイズを設定
getContentPane().add(mp);//マイパネルを追加

setVisible(true);//フレームを表示
setDefaultCloseOperation(EXIT_ON_CLOSE);//クローズ処理
}

@Override
public void actionPerformed(ActionEvent arg0) {
if (resetButton == arg0.getSource()) {//リセットボタンが押されたら
mp.repaint();//グラフィックをリセット
try {
Thread.sleep(100);
} catch(Exception ex) {
System.out.println("[ERR!]" + ex);
}
}
}

/*+++ マイパネルクラス +++*/
class MyPanel extends JPanel
implements MouseListener,MouseMotionListener{
private static final long serialVersionUID = 1L;

MyPanel() {
addMouseMotionListener(this);//マウスモーションイベントを追加
addMouseListener(this);//マウスイベントを追加
}

/*+++ マウスを押したとき +++*/
public void mousePressed(MouseEvent e) {
e.consume();
x1 = x2 = e.getX();
y1 = y2 = e.getY();
paintComponent(getGraphics());
}

/*+++ マウスをドラッグしているとき +++*/
public void mouseDragged(MouseEvent e) {
e.consume();

x2 = e.getX();
y2 = e.getY();

paintComponent(getGraphics());//描画

x1 = e.getX();//これが新たな
y1 = e.getY();//始点となる
}

/*+++ マウスが動いているとき +++*/
public void mouseMoved(MouseEvent e) {
}

/*+++ マウスボタンが離されたとき +++*/
public void mouseReleased(MouseEvent e) {
}

/*+++ マウスがフレーム内に入ったとき +++*/
public void mouseEntered(MouseEvent e) {
}

/*+++ マウスがフレーム外に出たとき +++*/
public void mouseExited(MouseEvent e) {
}

/*+++ マウスがクリックされたとき +++*/
public void mouseClicked(MouseEvent e) {
}

/*+++ ペイントメソッド +++*/
public void paintComponent(Graphics g) {
g.drawLine(x1, y1, x2, y2);
}
}
}

投稿日時 - 2012-04-20 22:40:01

QNo.7432202

暇なときに回答ください

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

mp.repaint()
してもJFrame自体がrepaint()しなきゃmpがrepaintされる時にサイズが無くなる瞬間にボタンが一番上に来て、残像がそこに残ります。

変えたコードが↓です。
http://pastebin.ca/2138477

で、JFrameのrepaint()を呼べば、中のJComponent達もrepaintされるのでmpのrepaintはする必要ない。

他に変えたところ:
1)場所配置にはlayout managerを使いましょう。簡単にキレイにコードがかけます。
2)ボタンを押した時にしたいものはボタン専用のactionListenerを作りましょう。質問で書かれているものだとウィンドウに最大化、リサイズしたり動かす度にJFrameのactionListenerが呼ばれて無駄です。(なので、java_test_04クラスはActionListenerをinheritしなくていい)

ただ、一番の問題はウィンドウに何かアクションが起こると、ウィンドウがrepaint → mpがrepaintされるということです。絵描き用のプログラムだったらそうだと考えにくいのですが、ウィンドウに何か起こる度にキャンバスが空になるべきなんですか?書いたものをどうにかして保存しないと。

投稿日時 - 2012-04-21 09:56:53

お礼

質問内容だけでなく、その他のアドバイスまで解りやすく
ご回答ありがとうございます! お陰様で上手く動作しました。

投稿日時 - 2012-04-21 14:28:52

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問