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

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

ただいまの
回答率

91.28%

  • Java

    10819questions

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

Javaでペイントソフトを作っています。画面のクリアと画面消去の仕様をどうすればいいか困っています。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 65

wakatakeru

score 2

Javaでペイントソフトを作っています。画面のクリアと画面消去の仕様をどうすればいいか困っています。

具体的にはClearというボタンを押したら画面に書かれている図をすべて消す
Quitというボタンを押したらウィンドウを消す。

という仕様です。
以下が途中のソースコードになります。

package java07sentaku;

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

abstract class Figure {
protected int x, y, width, height;
protected Color color;

public Figure(int x, int y, int w, int h, Color c) {
this.x = x;
this.y = y;
width = w;
height = h;
color = c;
}

public void setSize(int w, int h) {
width = w;
height = h;
}

public void setLocation(int x, int y) {
this.x = x;
this.y = y;
}

abstract public void reshape(int x1, int y1, int x2, int y2);

abstract public void paint(Graphics g);
}

class LineFigure extends Figure {
public LineFigure(int x, int y, int w, int h, Color c) {
super(x, y, w, h, c);
}

public void reshape(int x1, int y1, int x2, int y2) {
setLocation(x1, y1);
setSize(x2, y2);
}

public void paint(Graphics g) {
g.setColor(color);
g.drawLine(x, y, width, height);
}
}

class CircleFigure extends Figure {
public CircleFigure(int x, int y, int w, int h, Color c) {
super(x, y, w, h, c);
}

public void reshape(int x1, int y1, int x2, int y2) {
int newx = Math.min(x1, x2);
int newy = Math.min(y1, y2);
int neww = Math.abs(x1 - x2);
int newh = Math.abs(y1 - y2);
setLocation(newx, newy);
setSize(neww, newh);
}

public void paint(Graphics g) {
g.setColor(color);
g.drawOval(x, y, width, height);
}
}

class RectangleFigure extends Figure {
public RectangleFigure(int x, int y, int w, int h, Color c) {
super(x, y, w, h, c);
}

public void reshape(int x1, int y1, int x2, int y2) {
int newx = Math.min(x1, x2);
int newy = Math.min(y1, y2);
int neww = Math.abs(x1 - x2);
int newh = Math.abs(y1 - y2);
setLocation(newx, newy);
setSize(neww, newh);
}

public void paint(Graphics g) {
g.setColor(color);
g.drawRect(x, y, width, height);
}
}

class DrawApplication {
protected Vector<Figure> figures;
protected Figure drawingFigure;
protected String figurelabel;
protected Color currentColor;
protected DrawPanel drawPanel;

public DrawApplication() {
figures = new Vector<Figure>();
drawingFigure = null;
currentColor = Color.BLACK;
figurelabel = "rect";
}

public void setDrawPanel(DrawPanel c) {
drawPanel = c;
}

public int getNumberOfFigures() {
return figures.size();
}

public Figure getFigure(int index) {
return (Figure) figures.elementAt(index);
}

public void createFigure(int x, int y) {
Figure f = null;
;
if (figurelabel == "rect")
f = new RectangleFigure(x, y, 0, 0, currentColor);
else if (figurelabel == "circ")
f = new CircleFigure(x, y, 0, 0, currentColor);
else if (figurelabel == "line")
f = new LineFigure(x, y, x, y, currentColor);

figures.addElement(f);
drawingFigure = f;
drawPanel.repaint();
}

public void reshapeFigure(int x1, int y1, int x2, int y2) {
if (drawingFigure != null) {
drawingFigure.reshape(x1, y1, x2, y2);
drawPanel.repaint();
}
}

public void changecolor(Color c) {
currentColor = c;
}

public void changefigure(String s) {
figurelabel = s;
}

public void undo() {
figures.remove(figures.size()-1);
drawPanel.repaint();
}
}

class DrawPanel extends JPanel {
protected DrawApplication drawApplication;

public DrawPanel(DrawApplication app) {
setBackground(Color.white);
drawApplication = app;
}

public void paintComponent(Graphics g) {
super.paintComponent(g);
// [すべてのFigureをpaintする]
for (int i = 0; i < drawApplication.getNumberOfFigures(); i++) {
Figure f = drawApplication.getFigure(i);
f.paint(g);
}
}
}

class DrawMouseListener implements MouseListener, MouseMotionListener {
protected DrawApplication drawApplication;
protected int dragStartX, dragStartY;

public DrawMouseListener(DrawApplication a) {
drawApplication = a;
}

public void mouseClicked(MouseEvent e) {
}

public void mousePressed(MouseEvent e) {
dragStartX = e.getX();
dragStartY = e.getY();
if (SwingUtilities.isRightMouseButton(e) == true)
drawApplication.undo();
else if (SwingUtilities.isLeftMouseButton(e) == true)
drawApplication.createFigure(dragStartX, dragStartY);

}

public void mouseReleased(MouseEvent e) {
drawApplication.reshapeFigure(dragStartX, dragStartY, e.getX(), e.getY());
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public void mouseDragged(MouseEvent e) {
drawApplication.reshapeFigure(dragStartX, dragStartY, e.getX(), e.getY());
}

public void mouseMoved(MouseEvent e) {
}
}

class Select implements ActionListener {
DrawApplication a;

Select(DrawApplication ap) {
a = ap;
}

public void actionPerformed(ActionEvent e) { // 設定の変更
String es = e.getActionCommand();
if (es.equals("red"))
a.changecolor(Color.red);
if (es.equals("green"))
a.changecolor(Color.green);
if (es.equals("black"))
a.changecolor(Color.black);
if (es.equals("rect"))
a.changefigure("rect");
if (es.equals("circ"))
a.changefigure("circ");
if (es.equals("line"))
a.changefigure("line");
if(es.equals("clear")){
//ここに画面消去の処理
}
if(es.equals("Quit")){
//ここにウィンドウを閉じる処理
}

}
}

class DrawMain {
public static void main(String argv[]) {
JFrame f = new JFrame("Draw");
JPanel pc = new JPanel();
JPanel pf = new JPanel();
pc.setLayout(new GridLayout(1, 3));
pf.setLayout(new GridLayout(1, 3));
JButton r = new JButton("Red");
JButton g = new JButton("Green");
JButton b = new JButton("Black");

JButton rect = new JButton("Rect");
JButton circ = new JButton("Oval");
JButton line = new JButton("Line");
JButton clear = new JButton("Clear");
JButton quit = new JButton("Quit");

r.setActionCommand("red");
g.setActionCommand("green");
b.setActionCommand("black");

rect.setActionCommand("rect");
circ.setActionCommand("circ");
line.setActionCommand("line");
//clear.setActioncommand("clear");
//clear.setActioncommand("quit");

DrawApplication a = new DrawApplication();
DrawPanel dp = new DrawPanel(a);
a.setDrawPanel(dp);
DrawMouseListener ml = new DrawMouseListener(a);
dp.addMouseListener(ml);
dp.addMouseMotionListener(ml);
pc.add(r);
pc.add(g);
pc.add(b);

pf.add(rect);
pf.add(circ);
pf.add(line);
pf.add(clear);
pf.add(quit);

b.addActionListener(new Select(a));
g.addActionListener(new Select(a));
r.addActionListener(new Select(a));
rect.addActionListener(new Select(a));
circ.addActionListener(new Select(a));
line.addActionListener(new Select(a));
clear.addActionListener(new Select(a));

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(dp, BorderLayout.CENTER);
f.getContentPane().add(pc, BorderLayout.SOUTH);
f.getContentPane().add(pf, BorderLayout.NORTH);

f.setSize(400, 300);
f.setVisible(true);
}
}

この書き方で実装できない場合は
書き換えても全然構いません。

どうぞよろしくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

+1

if(es.equals("clear")){
int num = a.getNumberOfFigures();
for (int i = 0; i < num ; i++) {
a.undo();
}
}
if(es.equals("quit")){
System.exit(0);
}

これで解決できました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

自己解決おめでとうございます。力作なペイントソフトですね。
解決済みですが、ソースコードを見て気になった点がありましたので、勝手ですが添削したソースコードをコメント致します。

まず、画面のレイアウト定義ですが、eclipseを使用しているのでしたらマーケットプライスの画面よりWindowBuilderをインストールして、デザイン画面を使用し画面のレイアウトの作成を行う方法がお勧めです。ご参考まで。

以下は添削したソースコードです。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.util.ArrayDeque;
import java.util.Deque;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputAdapter;

abstract class Figure {
    //protected int x, y, width, height;
    // 4つの変数をRectangleに変更
    protected Rectangle rect = new Rectangle();
    protected Color color;

    public Figure(int x, int y, int w, int h, Color c) {
        setLocation(x, y);
        setSize(w, h);
        color = c;
    }

    public void setSize(int w, int h) {
        rect.setSize(w, h);
    }

    public void setLocation(int x, int y) {
        rect.setLocation(x, y);
    }

    abstract public void reshape(int x1, int y1, int x2, int y2);

    abstract public void paint(Graphics g);
}

class LineFigure extends Figure {
    public LineFigure(int x, int y, int w, int h, Color c) {
        super(x, y, w, h, c);
    }
    //@Overrideアノテーションを付けてOverrideメソッドを明示する。
    @Override
    public void reshape(int x1, int y1, int x2, int y2) {
        setLocation(x1, y1);
        setSize(x2, y2);
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(color);
        g.drawLine(rect.x, rect.y, rect.width, rect.height);
    }
}

class CircleFigure extends Figure {
    public CircleFigure(int x, int y, int w, int h, Color c) {
        super(x, y, w, h, c);
    }

    @Override
    public void reshape(int x1, int y1, int x2, int y2) {
        int newx = Math.min(x1, x2);
        int newy = Math.min(y1, y2);
        int neww = Math.abs(x1 - x2);
        int newh = Math.abs(y1 - y2);
        setLocation(newx, newy);
        setSize(neww, newh);
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(color);
        g.drawOval(rect.x, rect.y, rect.width, rect.height);
    }
}

class RectangleFigure extends Figure {
    public RectangleFigure(int x, int y, int w, int h, Color c) {
        super(x, y, w, h, c);
    }

    @Override
    public void reshape(int x1, int y1, int x2, int y2) {
        int newx = Math.min(x1, x2);
        int newy = Math.min(y1, y2);
        int neww = Math.abs(x1 - x2);
        int newh = Math.abs(y1 - y2);
        setLocation(newx, newy);
        setSize(neww, newh);
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(color);
        g.drawRect(rect.x, rect.y, rect.width, rect.height);
    }
}

class DrawApplication {
    // protected Vector<Figure> figures;
    // java.util.Dequeに変更
    protected Deque<Figure> figures;
    protected Figure drawingFigure;
    protected String figurelabel;
    protected Color currentColor;
    protected DrawPanel drawPanel;

    public DrawApplication() {
        figures = new ArrayDeque<>();
        drawingFigure = null;
        currentColor = Color.BLACK;
        figurelabel = "rect";
    }

    public void setDrawPanel(DrawPanel c) {
        drawPanel = c;
    }

    public int getNumberOfFigures() {
        return figures.size();
    }

    public void paintComponent(Graphics g) {
        // [すべてのFigureをpaintする]
        for (Figure f : figures) {
            f.paint(g);
        }
    }

    public void createFigure(int x, int y) {
        Figure f = null;
        ;
        if (figurelabel == "rect")
            f = new RectangleFigure(x, y, 0, 0, currentColor);
        else if (figurelabel == "circ")
            f = new CircleFigure(x, y, 0, 0, currentColor);
        else if (figurelabel == "line")
            f = new LineFigure(x, y, x, y, currentColor);

        figures.add(f);
        drawingFigure = f;
        drawPanel.repaint();
    }

    public void reshapeFigure(int x1, int y1, int x2, int y2) {
        if (drawingFigure != null) {
            drawingFigure.reshape(x1, y1, x2, y2);
            drawPanel.repaint();
        }
    }

    public void changecolor(Color c) {
        currentColor = c;
    }

    public void changefigure(String s) {
        figurelabel = s;
    }

    public void undo() {
        // undo対象がない時は処理を抜ける
        if (figures.isEmpty()) {
            return;
        }
        figures.removeLast();
        drawPanel.repaint();
    }

    public void undoAll() {
        int num = figures.size();
        for (int i = 0; i < num; i++) {
            this.undo();
        }
    }
}

@SuppressWarnings("serial")
class DrawPanel extends JPanel {
    protected DrawApplication drawApplication;

    public DrawPanel(DrawApplication app) {
        setBackground(Color.white);
        drawApplication = app;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //// [すべてのFigureをpaintする]
        // for (int i = 0; i < drawApplication.getNumberOfFigures(); i++) {
        // Figure f = drawApplication.getFigure(i);
        // f.paint(g);
        // }
        // DrawApplicationにpaintComponent処理を新設し処理を委譲
        drawApplication.paintComponent(g);
    }
}

// class DrawMouseListener implements MouseListener, MouseMotionListener {
//MouseInputAdapterを継承するように変更
class DrawMouseListener extends MouseInputAdapter {
    protected DrawApplication drawApplication;
    protected int dragStartX, dragStartY;

    public DrawMouseListener(DrawApplication a) {
        drawApplication = a;
    }

    @Override
    public void mousePressed(MouseEvent e) {
        dragStartX = e.getX();
        dragStartY = e.getY();
        if (SwingUtilities.isRightMouseButton(e) == true)
            drawApplication.undo();
        else if (SwingUtilities.isLeftMouseButton(e) == true)
            drawApplication.createFigure(dragStartX, dragStartY);

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        drawApplication.reshapeFigure(dragStartX, dragStartY, e.getX(), e.getY());
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        drawApplication.reshapeFigure(dragStartX, dragStartY, e.getX(), e.getY());
    }
}

class Select implements ActionListener {
    DrawApplication a;

    Select(DrawApplication ap) {
        a = ap;
    }

    @Override
    public void actionPerformed(ActionEvent e) { // 設定の変更
        String es = e.getActionCommand();
        if (es.equals("red"))
            a.changecolor(Color.red);
        if (es.equals("green"))
            a.changecolor(Color.green);
        if (es.equals("black"))
            a.changecolor(Color.black);
        if (es.equals("rect"))
            a.changefigure("rect");
        if (es.equals("circ"))
            a.changefigure("circ");
        if (es.equals("line"))
            a.changefigure("line");
        if (es.equals("clear")) {
            a.undoAll();
        }
        if (es.equals("quit")) {
            System.exit(0);
        }
    }
}

class DrawMain {
    public static void main(String argv[]) {
        SwingUtilities.invokeLater(() -> {
            JFrame f = new JFrame("Draw");
            //setDefaultCloseOperationは一番先頭に
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel pc = new JPanel();
            JPanel pf = new JPanel();
            pc.setLayout(new GridLayout(1, 3));
            pf.setLayout(new GridLayout(1, 3));
            JButton r = new JButton("Red");
            JButton g = new JButton("Green");
            JButton b = new JButton("Black");

            JButton rect = new JButton("Rect");
            JButton circ = new JButton("Oval");
            JButton line = new JButton("Line");
            JButton clear = new JButton("Clear");
            JButton quit = new JButton("Quit");

            r.setActionCommand("red");
            g.setActionCommand("green");
            b.setActionCommand("black");

            rect.setActionCommand("rect");
            circ.setActionCommand("circ");
            line.setActionCommand("line");
            clear.setActionCommand("clear");
            quit.setActionCommand("quit");

            DrawApplication a = new DrawApplication();
            DrawPanel dp = new DrawPanel(a);
            a.setDrawPanel(dp);
            DrawMouseListener ml = new DrawMouseListener(a);
            dp.addMouseListener(ml);
            dp.addMouseMotionListener(ml);
            pc.add(r);
            pc.add(g);
            pc.add(b);

            pf.add(rect);
            pf.add(circ);
            pf.add(line);
            pf.add(clear);
            pf.add(quit);
            //アクションリスナーを生成後に追加
            Select s = new Select(a);
            b.addActionListener(s);
            g.addActionListener(s);
            r.addActionListener(s);
            rect.addActionListener(s);
            circ.addActionListener(s);
            line.addActionListener(s);
            clear.addActionListener(s);
            quit.addActionListener(s);

            f.getContentPane().add(dp, BorderLayout.CENTER);
            f.getContentPane().add(pc, BorderLayout.SOUTH);
            f.getContentPane().add(pf, BorderLayout.NORTH);

            f.setSize(400, 300);
            f.setVisible(true);
        });
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/08 05:21

    そのようなやり方があったのですね!勉強になります、ありがとうございます!!

    キャンセル

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

ただいまの回答率

91.28%

関連した質問

同じタグがついた質問を見る

  • Java

    10819questions

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

  • トップ
  • Javaに関する質問
  • Javaでペイントソフトを作っています。画面のクリアと画面消去の仕様をどうすればいいか困っています。