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

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

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

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

Q&A

解決済

4回答

1121閲覧

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

pirika

総合スコア6

Java

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

0グッド

0クリップ

投稿2022/08/28 09:25

編集2022/08/28 11:21

前提

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

実現したいこと

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

該当のソースコード

java

1import javax.swing.*; 2import java.awt.*; 3import java.awt.event.*; 4import java.util.*; 5// 描画した図形を記録する Figure クラス (継承して利用する) 6class Figure { 7 protected int x, y, width, height; 8 protected Color color; 9 public Figure(int x, int y, int w, int h, Color c) { 10 this.x = x; 11 this.y = y; // this.x, this.y はインスタンス変数. 12 width = w; 13 height = h; // ローカル変数で同名の変数がある場合は,this 14 color = c; // を付けると,インスタンス変数を指す. 15 } 16 public void setSize(int w, int h) { 17 width = w; 18 height = h; 19 } 20 public void setLocation(int x, int y) { 21 this.x = x; 22 this.y = y; 23 } 24 public void reshape(int x1, int y1, int x2, int y2) { 25 } 26 public void draw(Graphics g) { 27 } 28} 29class CircleFigure extends Figure { 30 public CircleFigure(int x, int y, int w, int h, Color c) { 31 super(x, y, w, h, c); 32 } 33 public void reshape(int x1, int y1, int x2, int y2) { 34 int newx = Math.min(x1, x2); 35 int newy = Math.min(y1, y2); 36 int neww = Math.abs(x1 - x2); 37 int newh = Math.abs(y1 - y2); 38 setLocation(newx, newy); 39 setSize(neww, newh); 40 } 41 public void draw(Graphics g) { 42 g.setColor(color); 43 g.drawOval(x, y, width, height); 44 } 45} 46class LineFigure extends Figure { 47 public LineFigure(int x, int y, int w, int h, Color c) { 48 super(x, y, w, h, c); 49 } 50 public void reshape(int x1, int y1, int x2, int y2) { 51 setLocation(x1, y1); 52 setSize(x2, y2); 53 } 54 public void draw(Graphics g) { 55 g.setColor(color); 56 g.drawLine(x, y, width, height); 57 } 58} 59class RectangleFigure extends Figure { 60 public RectangleFigure(int x, int y, int w, int h, Color c) { 61 super(x, y, w, h, c); 62 // 引数付きのコンストラクタは継承されないので,コンストラクタを定義. 63 // superで親のコンストラクタを呼び出すだけ. 64 } 65 public void reshape(int x1, int y1, int x2, int y2) { 66 int newx = Math.min(x1, x2); 67 int newy = Math.min(y1, y2); 68 int neww = Math.abs(x1 - x2); 69 int newh = Math.abs(y1 - y2); 70 setLocation(newx, newy); 71 setSize(neww, newh); 72 } 73 public void draw(Graphics g) { 74 g.setColor(color); 75 g.drawRect(x, y, width, height); 76 } 77} 78//////////////////////////////////////////////// 79// Model (M) 80// modelは java.util.Observableを継承する.Viewに監視される. 81class DrawModel extends Observable { 82 protected ArrayList<Figure> fig; 83 protected String figurelabel; 84 protected Figure drawingFigure; 85 protected Color currentColor; 86 protected ViewPanel viewPanel; 87 public DrawModel() { 88 fig = new ArrayList<Figure>(); 89 drawingFigure = null; 90 currentColor = Color.red; 91 } 92 public void setViewPanel(ViewPanel c) { 93 viewPanel = c; 94 } 95 public ArrayList<Figure> getFigures() { 96 return fig; 97 } 98 public Figure getFigure(int idx) { 99 return fig.get(idx); 100 } 101 public void createFigure(int x, int y) { 102 Figure f = null; 103 ; 104 if (figurelabel == "rect") 105 f = new RectangleFigure(x, y, 0, 0, currentColor); 106 else if (figurelabel == "circ") 107 f = new CircleFigure(x, y, 0, 0, currentColor); 108 else if (figurelabel == "line") 109 f = new LineFigure(x, y, x, y, currentColor); 110 fig.add(f); 111 drawingFigure = f; 112 viewPanel.repaint(); 113 setChanged(); 114 notifyObservers(); 115 } 116 public void reshapeFigure(int x1, int y1, int x2, int y2) { 117 if (drawingFigure != null) { 118 drawingFigure.reshape(x1, y1, x2, y2); 119 viewPanel.repaint(); 120 setChanged(); 121 notifyObservers(); 122 } 123 } 124 public void changecolor(Color col) { 125 currentColor = col; 126 } 127 public void changefigure(String fi) { 128 figurelabel = fi; 129 } 130} 131//////////////////////////////////////////////// 132// View (V) 133// Viewは,Observerをimplementsする.Modelを監視して, 134// モデルが更新されたupdateする.実際には,Modelから 135// update が呼び出される. 136class ViewPanel extends JPanel implements Observer { 137 protected DrawModel model; 138 public ViewPanel(DrawModel m) { 139 this.setBackground(Color.white); 140 model = m; 141 model.addObserver(this); 142 } 143 public void paintComponent(Graphics g) { 144 super.paintComponent(g); 145 ArrayList<Figure> fig = model.getFigures(); 146 for (int i = 0; i < fig.size(); i++) { 147 Figure f = fig.get(i); 148 f.draw(g); 149 } 150 } 151 public void update(Observable o, Object arg) { 152 repaint(); 153 } 154} 155class Select implements ActionListener { 156 DrawModel a; 157 Select(DrawModel ap) { 158 a = ap; 159 } 160 public void actionPerformed(ActionEvent e) { // 設定の変更 161 String es = e.getActionCommand(); 162 if (es.equals("red")) 163 a.changecolor(Color.red); 164 if (es.equals("green")) 165 a.changecolor(Color.green); 166 if (es.equals("blue")) 167 a.changecolor(Color.blue); 168 if (es.equals("rect")) 169 a.changefigure("rect"); 170 if (es.equals("circ")) 171 a.changefigure("circ"); 172 if (es.equals("line")) 173 a.changefigure("line"); 174 } 175} 176////////////////////////////////////////////////// 177// Main class 178// (GUIを組み立てているので,view の一部と考えてもよい) 179class DrawFrame extends JFrame { 180 DrawModel model; 181 ViewPanel view; 182 DrawController cont; 183 public static void main(String[] args) { 184 JFrame f = new JFrame("Draw"); 185 JPanel pc = new JPanel(); 186 JPanel pf = new JPanel(); 187 pc.setLayout(new GridLayout(1, 3)); 188 pf.setLayout(new GridLayout(1, 3)); 189 JButton r = new JButton("red"); 190 JButton g = new JButton("green"); 191 JButton b = new JButton("blue"); 192 JButton rect = new JButton("rect"); 193 JButton circ = new JButton("circ"); 194 JButton line = new JButton("line"); 195 r.setActionCommand("red"); 196 g.setActionCommand("green"); 197 b.setActionCommand("blue"); 198 rect.setActionCommand("rect"); 199 circ.setActionCommand("circ"); 200 line.setActionCommand("line"); 201 DrawModel a = new DrawModel(); 202 ViewPanel dp = new ViewPanel(a); 203 a.setViewPanel(dp); 204 DrawController ml = new DrawController(a); 205 dp.addMouseListener(ml); 206 dp.addMouseMotionListener(ml); 207 pc.add(r); 208 pc.add(g); 209 pc.add(b); 210 pf.add(rect); 211 pf.add(circ); 212 pf.add(line); 213 b.addActionListener(new Select(a)); 214 g.addActionListener(new Select(a)); 215 r.addActionListener(new Select(a)); 216 circ.addActionListener(new Select(a)); 217 rect.addActionListener(new Select(a)); 218 line.addActionListener(new Select(a)); 219 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 220 f.getContentPane().add(dp, BorderLayout.CENTER); 221 f.getContentPane().add(pc, BorderLayout.SOUTH); 222 f.getContentPane().add(pf, BorderLayout.NORTH); 223 f.setSize(400, 300); 224 f.setVisible(true); 225 } 226} 227//////////////////////////////////////////////// 228// Controller (C) 229class DrawController implements MouseListener, MouseMotionListener { 230 protected DrawModel model; 231 protected int dragStartX, dragStartY; 232 public DrawController(DrawModel a) { 233 model = a; 234 } 235 public void mouseClicked(MouseEvent e) { 236 } 237 public void mousePressed(MouseEvent e) { 238 dragStartX = e.getX(); 239 dragStartY = e.getY(); 240 model.createFigure(dragStartX, dragStartY); 241 } 242 public void mouseDragged(MouseEvent e) { 243 model.reshapeFigure(dragStartX, dragStartY, e.getX(), e.getY()); 244 } 245 public void mouseReleased(MouseEvent e) { 246 model.reshapeFigure(dragStartX, dragStartY, e.getX(), e.getY()); 247 } 248 public void mouseEntered(MouseEvent e) { 249 } 250 public void mouseExited(MouseEvent e) { 251 } 252 public void mouseMoved(MouseEvent e) { 253 } 254}

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

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

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

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

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

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 でよくある「文字列を == で比較しようとしてしまう」バグが見つかるはずです。
guest

回答4

0

習作を元にするとバグが元からなのか新しく入れてしまったのか分からなくなりますので注意されたほうが良いと思います。
ネタとしては良いものと思いますので、直しつつやってみました。

java

1import java.awt.*; 2import java.awt.event.MouseAdapter; 3import java.awt.event.MouseEvent; 4import java.util.ArrayList; 5 6import javax.swing.*; 7 8public class DrawFrame extends JFrame { 9 public static void main(String[] args) { 10 SwingUtilities.invokeLater(() -> new DrawFrame().setVisible(true)); 11 } 12 13 private Figure.Drawer drawer; 14 private Color color; 15 16 DrawFrame() { 17 super("Draw"); 18 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 19 setSize(400, 300); 20 21 DrawModel model = new DrawModel(); 22 DrawPanel panel = new DrawPanel(model); 23 24 MouseAdapter adapter = new MouseAdapter() { 25 @Override 26 public void mousePressed(MouseEvent e) { 27 model.add(new Figure(e.getX(), e.getY(), color, drawer)); 28 panel.repaint(); 29 } 30 @Override 31 public void mouseDragged(MouseEvent e) { 32 model.getLastFigure().setSecondPoint(e.getX(), e.getY()); 33 panel.repaint(); 34 } 35 }; 36 panel.addMouseListener(adapter); 37 panel.addMouseMotionListener(adapter); 38 39 add(new SelectPanel<Figure.Drawer>(Figure.Drawer.values(), fd -> drawer = fd), BorderLayout.NORTH); 40 add(panel, BorderLayout.CENTER); 41 add(new SelectPanel<LabeledColor>(LabeledColor.values(), lc -> color = lc.color), BorderLayout.SOUTH); 42 } 43} 44 45class DrawPanel extends JPanel { 46 private DrawModel model; 47 48 DrawPanel(DrawModel model) { 49 super(null); 50 setBackground(Color.white); 51 52 this.model = model; 53 } 54 55 @Override 56 public void paintComponent(Graphics g) { 57 super.paintComponent(g); 58 for(Figure f : model.getFigures()) f.draw(g); 59 } 60} 61 62class SelectPanel<T extends SelectPanel.Labeled> extends JPanel { 63 interface Labeled { 64 String getLabel(); 65 } 66 interface SelectListener<T> { 67 void valueSelected(T v); 68 } 69 70 SelectPanel(T[] values, SelectListener<T> listener) { 71 super(new GridLayout(1, values.length)); 72 73 JToggleButton defaultButton = null; 74 ButtonGroup group = new ButtonGroup(); 75 for(T v : values) { 76 JToggleButton button = new JToggleButton(v.getLabel()); 77 button.addChangeListener(e -> { if(button.isSelected()) listener.valueSelected(v); }); 78 group.add(button); 79 add(button); 80 if(defaultButton == null) defaultButton = button; 81 } 82 defaultButton.doClick(); 83 } 84} 85 86enum LabeledColor implements SelectPanel.Labeled { 87 RED("red", Color.RED), 88 GREEN("green", Color.GREEN), 89 BLUE("blue", Color.BLUE); 90 91 private String label; 92 Color color; 93 94 LabeledColor(String label, Color color) { 95 this.label = label; 96 this.color = color; 97 } 98 @Override 99 public String getLabel() { return label; } 100} 101 102class DrawModel { 103 private java.util.List<Figure> figureList = new ArrayList<Figure>(); 104 105 Figure[] getFigures() { 106 return figureList.toArray(new Figure[figureList.size()]); 107 } 108 Figure getLastFigure() { 109 return figureList.isEmpty() ? null : figureList.get(figureList.size() - 1); 110 } 111 void add(Figure f) { 112 figureList.add(f); 113 } 114} 115 116class Figure { 117 enum Drawer implements SelectPanel.Labeled { 118 RECT("rect") { 119 void draw(Figure f, Graphics g) { 120 g.drawRect(f.rect.x, f.rect.y, f.rect.width, f.rect.height); 121 } 122 }, 123 CIRC("circ") { 124 void draw(Figure f, Graphics g) { 125 g.drawOval(f.rect.x, f.rect.y, f.rect.width, f.rect.height); 126 } 127 }, 128 LINE("line") { 129 void draw(Figure f, Graphics g) { 130 g.drawLine(f.x, f.y, f.x2, f.y2); 131 } 132 }; 133 134 private String label; 135 136 Drawer(String label) { 137 this.label = label; 138 } 139 @Override 140 public String getLabel() { return label; } 141 142 abstract void draw(Figure f, Graphics g); 143 } 144 145 private int x, y, x2, y2; 146 private Rectangle rect; 147 private Color color; 148 private Drawer drawer; 149 150 Figure(int x, int y, Color color, Drawer drawer) { 151 this.x = x; 152 this.y = y; 153 this.color = color; 154 this.drawer = drawer; 155 setSecondPoint(x, y); 156 } 157 void setSecondPoint(int x2, int y2) { 158 this.x2 = x2; 159 this.y2 = y2; 160 rect = new Rectangle(Math.min(x,x2), Math.min(y,y2), Math.abs(x-x2), Math.abs(y-y2)); 161 } 162 void draw(Graphics g) { 163 g.setColor(color); 164 drawer.draw(this, g); 165 } 166}

投稿2022/08/30 09:01

jimbe

総合スコア12938

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

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

0

126行目以降の

java

1public void createFigure(int x, int y) { 2 Figure f = null; 3 ; 4 if (Objects.equals(figurelabel, "rect")) 5 f = new RectangleFigure(x, y, 0, 0, currentColor); 6 else if (Objects.equals(figurelabel, "circ")) 7 f = new CircleFigure(x, y, 0, 0, currentColor); 8 else 9 f = new LineFigure(x, y, x, y, currentColor); 10 fig.add(f); 11 drawingFigure = f; 12 viewPanel.repaint(); 13 setChanged(); 14 notifyObservers(); 15 }

としてObject.equals(a, b)によって判定を行い,また最後をelseで処理する事で何も選んでいない場合にはLineが引かれるようにしたところ上手く動作させる事が出来ました.
以前にご指摘いただいた時はObject.equals(a, b)を用いなくても何故か動いてしまい,このような事象となる事を想定しておりませんでした.丁寧なご指摘大変感謝いたします.

投稿2022/08/28 12:43

pirika

総合スコア6

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

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

0

figurelabelの初期値がないため、createFigureでnull(のFigure)がfigに追加されます。

Java

1public DrawModel() { 2 fig = new ArrayList<Figure>(); 3 drawingFigure = null; 4 currentColor = Color.red; 5 figurelabel = "rect"; // コレ 6}

参考コードは都度質問に明示してください。
Javaによる簡易ドローエディタの作成 - ふくろうのブログ。

前回の質問で指摘した点が全く反映されていないのは、意味が分からなかったということですか?(それとも聞く気がないということですか?)

こういったうっかりミスを防ぐために、@Overrideを書くようにしてください。
@Override public void draw(Graphics g) { }
文字列を==で比較するところが残っています。equalsで比較してください。

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

DrawFrame.java:98: 警告:[deprecation] java.utilのObservableは推奨されません
DrawFrame.java:163: 警告:[deprecation] java.utilのObserverは推奨されません
といった警告を確認した.

viewPanel.repaint()と直接自分で呼んでしまっているので、ObservableObserverも全く意味をなしていません。

投稿2022/08/28 12:20

TN8001

総合スコア9516

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

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

TN8001

2022/08/28 13:58

わからない点があればコメントしてくれれば解説する気はあるのですが、聞く気がないんじゃどうしようもないですねorz 元ネタを改悪してるようにしか見えません。。。
guest

0

ベストアンサー

眺めていて気になったのはここです。

Java

1class DrawModel extends Observable { 2 ... 3 public void createFigure(int x, int y) { 4 Figure f = null; 5 ; 6 if (figurelabel == "rect") 7 f = new RectangleFigure(x, y, 0, 0, currentColor); 8 else if (figurelabel == "circ") 9 f = new CircleFigure(x, y, 0, 0, currentColor); 10 else if (figurelabel == "line") 11 f = new LineFigure(x, y, x, y, currentColor); 12 fig.add(f); 13 ... 14 } 15 ... 16}

Javaでは文字列を == で比較するのは大抵の場合不適当で、
nullのままfigに放り込まれるパターンがあるんじゃないかと思いました。
また図形を未選択の場合もnullが入りそうですね。

いずれにせよ、どの条件にも当てはまらなかったときのケアは必要です。


上記の修正のうえ、figureLabelの初期値を適当に決めてやったら手元では動きました。
実際に動かしてみた

投稿2022/08/28 12:12

編集2022/08/28 12:30
LouiS0616

総合スコア35664

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

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

jimbe

2022/08/28 16:03

どうやら参考にされた元記事のコードが == になっているようです。
LouiS0616

2022/08/28 21:36

なんと。それはちょっとかわいそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問