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

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

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

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

解決済

Javaでドローエディタを作成する際にerrorが発生してしまう.

pirika
pirika

総合スコア6

Java

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

4回答

0リアクション

1クリップ

402閲覧

投稿2022/08/28 09:25

編集2022/08/28 11:21

前提

Javaでドローエディタを作成し,コンパイルしてファイルを作成し,ドローエディタをクリックするとエラーメッセージが表示されて描画できない.

実現したいこと

ドローエディタを作成したい.

該当のソースコード

java

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; // 描画した図形を記録する Figure クラス (継承して利用する) 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; // this.x, this.y はインスタンス変数. width = w; height = h; // ローカル変数で同名の変数がある場合は,this 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; } public void reshape(int x1, int y1, int x2, int y2) { } public void draw(Graphics g) { } } 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 draw(Graphics g) { g.setColor(color); g.drawOval(x, y, width, height); } } 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 draw(Graphics g) { g.setColor(color); g.drawLine(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); // 引数付きのコンストラクタは継承されないので,コンストラクタを定義. // superで親のコンストラクタを呼び出すだけ. } 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 draw(Graphics g) { g.setColor(color); g.drawRect(x, y, width, height); } } //////////////////////////////////////////////// // Model (M) // modelは java.util.Observableを継承する.Viewに監視される. class DrawModel extends Observable { protected ArrayList<Figure> fig; protected String figurelabel; protected Figure drawingFigure; protected Color currentColor; protected ViewPanel viewPanel; public DrawModel() { fig = new ArrayList<Figure>(); drawingFigure = null; currentColor = Color.red; } public void setViewPanel(ViewPanel c) { viewPanel = c; } public ArrayList<Figure> getFigures() { return fig; } public Figure getFigure(int idx) { return fig.get(idx); } 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); fig.add(f); drawingFigure = f; viewPanel.repaint(); setChanged(); notifyObservers(); } public void reshapeFigure(int x1, int y1, int x2, int y2) { if (drawingFigure != null) { drawingFigure.reshape(x1, y1, x2, y2); viewPanel.repaint(); setChanged(); notifyObservers(); } } public void changecolor(Color col) { currentColor = col; } public void changefigure(String fi) { figurelabel = fi; } } //////////////////////////////////////////////// // View (V) // Viewは,Observerをimplementsする.Modelを監視して, // モデルが更新されたupdateする.実際には,Modelから // update が呼び出される. class ViewPanel extends JPanel implements Observer { protected DrawModel model; public ViewPanel(DrawModel m) { this.setBackground(Color.white); model = m; model.addObserver(this); } public void paintComponent(Graphics g) { super.paintComponent(g); ArrayList<Figure> fig = model.getFigures(); for (int i = 0; i < fig.size(); i++) { Figure f = fig.get(i); f.draw(g); } } public void update(Observable o, Object arg) { repaint(); } } class Select implements ActionListener { DrawModel a; Select(DrawModel 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("blue")) a.changecolor(Color.blue); if (es.equals("rect")) a.changefigure("rect"); if (es.equals("circ")) a.changefigure("circ"); if (es.equals("line")) a.changefigure("line"); } } ////////////////////////////////////////////////// // Main class // (GUIを組み立てているので,view の一部と考えてもよい) class DrawFrame extends JFrame { DrawModel model; ViewPanel view; DrawController cont; public static void main(String[] args) { 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("blue"); JButton rect = new JButton("rect"); JButton circ = new JButton("circ"); JButton line = new JButton("line"); r.setActionCommand("red"); g.setActionCommand("green"); b.setActionCommand("blue"); rect.setActionCommand("rect"); circ.setActionCommand("circ"); line.setActionCommand("line"); DrawModel a = new DrawModel(); ViewPanel dp = new ViewPanel(a); a.setViewPanel(dp); DrawController ml = new DrawController(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); b.addActionListener(new Select(a)); g.addActionListener(new Select(a)); r.addActionListener(new Select(a)); circ.addActionListener(new Select(a)); rect.addActionListener(new Select(a)); line.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); } } //////////////////////////////////////////////// // Controller (C) class DrawController implements MouseListener, MouseMotionListener { protected DrawModel model; protected int dragStartX, dragStartY; public DrawController(DrawModel a) { model = a; } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { dragStartX = e.getX(); dragStartY = e.getY(); model.createFigure(dragStartX, dragStartY); } public void mouseDragged(MouseEvent e) { model.reshapeFigure(dragStartX, dragStartY, e.getX(), e.getY()); } public void mouseReleased(MouseEvent e) { model.reshapeFigure(dragStartX, dragStartY, e.getX(), e.getY()); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseMoved(MouseEvent e) { } }

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

2022/08/28 13:53

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

pirika

2022/08/28 09:25

### 該当のソースコード ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; // 描画した図形を記録する Figure クラス (継承して利用する) 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; // this.x, this.y はインスタンス変数. width = w; height = h; // ローカル変数で同名の変数がある場合は,this 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; } public void reshape(int x1, int y1, int x2, int y2) { } public void draw(Graphics g) { } } 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 draw(Graphics g) { g.setColor(color); g.drawOval(x, y, width, height); } } 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 draw(Graphics g) { g.setColor(color); g.drawLine(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); // 引数付きのコンストラクタは継承されないので,コンストラクタを定義. // superで親のコンストラクタを呼び出すだけ. } 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 draw(Graphics g) { g.setColor(color); g.drawRect(x, y, width, height); } } //////////////////////////////////////////////// // Model (M) // modelは java.util.Observableを継承する.Viewに監視される. class DrawModel extends Observable { protected ArrayList<Figure> fig; protected String figurelabel; protected Figure drawingFigure; protected Color currentColor; protected ViewPanel viewPanel; public DrawModel() { fig = new ArrayList<Figure>(); drawingFigure = null; currentColor = Color.red; } public void setViewPanel(ViewPanel c) { viewPanel = c; } public ArrayList<Figure> getFigures() { return fig; } public Figure getFigure(int idx) { return fig.get(idx); } 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); fig.add(f); drawingFigure = f; viewPanel.repaint(); setChanged(); notifyObservers(); } public void reshapeFigure(int x1, int y1, int x2, int y2) { if (drawingFigure != null) { drawingFigure.reshape(x1, y1, x2, y2); viewPanel.repaint(); setChanged(); notifyObservers(); } } public void changecolor(Color col) { currentColor = col; } public void changefigure(String fi) { figurelabel = fi; } } //////////////////////////////////////////////// // View (V) // Viewは,Observerをimplementsする.Modelを監視して, // モデルが更新されたupdateする.実際には,Modelから // update が呼び出される. class ViewPanel extends JPanel implements Observer { protected DrawModel model; public ViewPanel(DrawModel m) { this.setBackground(Color.white); model = m; model.addObserver(this); } public void paintComponent(Graphics g) { super.paintComponent(g); ArrayList<Figure> fig = model.getFigures(); for (int i = 0; i < fig.size(); i++) { Figure f = fig.get(i); f.draw(g); } } public void update(Observable o, Object arg) { repaint(); } } class Select implements ActionListener { DrawModel a; Select(DrawModel 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("blue")) a.changecolor(Color.blue); if (es.equals("rect")) a.changefigure("rect"); if (es.equals("circ")) a.changefigure("circ"); if (es.equals("line")) a.changefigure("line"); } } ////////////////////////////////////////////////// // Main class // (GUIを組み立てているので,view の一部と考えてもよい) class DrawFrame extends JFrame { DrawModel model; ViewPanel view; DrawController cont; public static void main(String[] args) { 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("blue"); JButton rect = new JButton("rect"); JButton circ = new JButton("circ"); JButton line = new JButton("line"); r.setActionCommand("red"); g.setActionCommand("green"); b.setActionCommand("blue"); rect.setActionCommand("rect"); circ.setActionCommand("circ"); line.setActionCommand("line"); DrawModel a = new DrawModel(); ViewPanel dp = new ViewPanel(a); a.setViewPanel(dp); DrawController ml = new DrawController(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); b.addActionListener(new Select(a)); g.addActionListener(new Select(a)); r.addActionListener(new Select(a)); circ.addActionListener(new Select(a)); rect.addActionListener(new Select(a)); line.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); } } //////////////////////////////////////////////// // Controller (C) class DrawController implements MouseListener, MouseMotionListener { protected DrawModel model; protected int dragStartX, dragStartY; public DrawController(DrawModel a) { model = a; } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { dragStartX = e.getX(); dragStartY = e.getY(); model.createFigure(dragStartX, dragStartY); } public void mouseDragged(MouseEvent e) { model.reshapeFigure(dragStartX, dragStartY, e.getX(), e.getY()); } public void mouseReleased(MouseEvent e) { model.reshapeFigure(dragStartX, dragStartY, e.getX(), e.getY()); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseMoved(MouseEvent e) { } } ``` ### 試したこと コンパイルを行った. ``` 「DrawFrame.java:98: 警告:[deprecation] java.utilのObservableは推奨されません class DrawModel extends Observable { ^ DrawFrame.java:163: 警告:[deprecation] java.utilのObserverは推奨されません class ViewPanel extends JPanel implements Observer { ^ DrawFrame.java:181: 警告:[deprecation] java.utilのObservableは推奨されません public void update(Observable o, Object arg) { ^ 警告3個」 ``` といった警告を確認した.
LouiS0616

2022/08/28 09:39

ソースコードは質問本文に記載して下さい。
pirika

2022/08/28 11:16

字数制限のためここに記載いたしました.
pirika

2022/08/28 11:49 編集

### 発生している問題・エラーメッセージ Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "Figure.draw(java.awt.Graphics)" because "<local4>" is null at ViewPanel.paintComponent(DrawFrame.java:177) at java.desktop/javax.swing.JComponent.paint(JComponent.java:1128) at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5318) at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBufferedImpl(RepaintManager.java:1656) at java.desktop/javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1631) at java.desktop/javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1569) at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1336) at java.desktop/javax.swing.JComponent._paintImmediately(JComponent.java:5266) at java.desktop/javax.swing.JComponent.paintImmediately(JComponent.java:5076) at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:878) at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:861) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:861) at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:834) at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:784) at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1897) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) エラーメッセージを記載いたします.
jimbe

2022/08/28 11:49 編集

コメントにマークダウンは適用されません。 NullPointerException ですので、該当箇所での変数の値を確認の上、原因を探ってください。
pirika

2022/08/28 11:50

修正いたしました.
jimbe

2022/08/28 12:02

>Observableは推奨されません >Observerは推奨されません 両者は java9 から非推奨となりました。 「ObserverとObservableでサポートされているイベント・モデルは非常に限定されており、Observableによって配信される通知の順序は不定であり、状態の変更は通知と1対1で対応していません。 豊富なイベント・モデルの場合は、java.beansパッケージの使用を検討してください。 スレッド間の信頼性の高い順序付きメッセージングのために、java.util.concurrentパッケージ内の同時データ構造の1つを使用することを検討してください。 リアクティブ・ストリーム・スタイルのプログラミングについては、Flow APIを参照してください。」 https://docs.oracle.com/javase/jp/9/docs/api/java/util/Observable.html
pirika

2022/08/28 12:13

NullPointerExceptionの味方が今一つわかっていないのですけれど,この場合はFigure.draw部分にエラーが発生しているという認識でよろしいでしょうか.
jimbe

2022/08/30 09:22 編集

NullPointerException に限らず、例外発生時のスタックトレースにはどこで何が起きたのかが書かれていますので、見方が分かっていないとデバッグの手がかりが無くなります。 > at ViewPanel.paintComponent(DrawFrame.java:177) とありますので、 ViewPanel クラスの paintComponent メソッド内 (DrawFrame.java ファイルの 177 行目 ) で NullPointerException が発生しています。 > Cannot invoke "Figure.draw(java.awt.Graphics)" because "<local4>" is null" は、 draw メソッドが ( ローカル変数が )null で呼べないということなので、 f.draw(g); の f が null になっていたのでしょう。 この f は model.getFigures() でモデルから得た list 中の一つとなりますが、その list への格納は DrawModel.createFigure メソッド内 fig.add(f); で行っています。こちらの f は初期値 null で一連の if 文で設定されることになっていますが、 if 文に引っかからなければ null が入ってしまうので原因の可能性があります。ここで思い込み無く if 文を見れば、 java でよくある「文字列を == で比較しようとしてしまう」バグが見つかるはずです。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Java

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