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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

解決済

1回答

1488閲覧

[Java] バッファーを使ってお絵描き機能を実現するときの不具合

doya91

総合スコア1

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

1グッド

0クリップ

投稿2021/07/05 10:51

前提

Javaでお絵描きプログラムを作ろうとしています。
基本仕様は自由にお絵描きしてSaveボタンを押すと、
バッファーを使って描いた絵をJPEG形式で保存するという形になります。

しかし、描いた線がパネルに表示されていない問題が発生しました。
色々調べましたが、解決方法が見つからず、
もしご存じの方いらっしゃいましたら、
教えていただけないでしょうか。

すみませんが、わたしは留学生ですので、もし失礼なところがあれば本当に申し訳ございません。
何卒宜しくお願い致します。

発生している問題・エラーメッセージ

セーブされた画像は描いた絵が表示されているが、
絵を描いている途中パネルには描いた線が表示されていません。
また、画面をクリアして描きなおす機能もうまく稼働できません。

該当のソースコード

java

1import java.awt.*; 2import java.awt.event.*; 3import java.awt.image.BufferedImage; 4import java.io.*; 5import javax.imageio.ImageIO; 6import javax.swing.*; 7 8 9public class Painting extends JFrame implements ActionListener{ 10 JPanel DrawPanel, SendPanel; 11 JButton ButtonSave; //button for saving picture 12 JButton ButtonClean; //button for cleaning the screen 13 String path = System.getProperty("user.dir"); 14 String name = "test"; 15 int startX,startY,endX,endY; //Drawing cursor 16 int width = 400; 17 int height = 400; 18 19 BufferedImage bufferImage = null; 20 Graphics2D bufferGraphics = null; 21 22 23 24 private void createBuffer(int width, int height) { 25 bufferImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 26 bufferGraphics = bufferImage.createGraphics(); 27 bufferGraphics.setBackground(Color.white); 28 bufferGraphics.clearRect(0, 0, width, height); 29 } 30 31 public void initGui(){ 32 DrawPanel = new JPanel(); 33 SendPanel = new JPanel(); 34 ButtonSave = new JButton("Save"); 35 ButtonClean = new JButton("Clean"); 36 37 38 //Set Button on SendPanel 39 SendPanel.add(ButtonSave); 40 SendPanel.add(ButtonClean); 41 SendPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 42 43 //Set DrawPanel size 44 DrawPanel.setPreferredSize(new Dimension(width,height)); 45 DrawPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); 46 if(bufferGraphics == null) createBuffer(width, height); 47 48 //when mouse push reset startX and startY 49 DrawPanel.addMouseListener(new MouseAdapter(){ 50 public void mousePressed(MouseEvent e){ 51 startX = e.getX(); 52 startY = e.getY(); 53 } 54 }); 55 56 //Paint setting 57 DrawPanel.addMouseMotionListener(new MouseAdapter(){ 58 public void mouseDragged(MouseEvent e){ 59 endX = e.getX(); 60 endY = e.getY(); 61 62 bufferGraphics.setColor(Color.BLACK); 63 bufferGraphics.setStroke(new BasicStroke(5)); 64 bufferGraphics.drawLine(startX,startY,endX,endY); 65 66 startX = endX; 67 startY = endY; 68 } 69 }); 70 71 //Button setting 72 ButtonSave.addActionListener(this); 73 ButtonClean.addActionListener(this); 74 75 76 //set JFrame 77 setLocation(400,200); 78 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 79 add(DrawPanel, BorderLayout.CENTER); 80 add(SendPanel, BorderLayout.SOUTH); 81 pack(); 82 setVisible(true); 83 } 84 85 86 public void paintComponet(Graphics2D g) { 87 super.paintComponents(g); 88 if(bufferImage != null) g.drawImage(bufferImage, 0, 0, this); 89 } 90 91 92 93 @Override 94 public void actionPerformed(ActionEvent e) { 95 if(e.getSource() == ButtonSave) { //press Save button to save picture 96 savePic(path + name + ".jpg"); 97 }else if(e.getSource() == ButtonClean){ //press Clean button to reset picture 98 DrawPanel.repaint(); 99 } 100 } 101 102 103 //capture picture 104 public void savePic(String path){ 105 try { 106 ImageIO.write(bufferImage, "jpg", new File(path)); 107 } catch (IOException e) { 108 e.printStackTrace(); 109 } 110 } 111 112 113 public static void main(String[] argv) { 114 Painting paint = new Painting(); 115 paint.initGui(); 116 } 117 118}
TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

セーブされた画像は描いた絵が表示されているが、
絵を描いている途中パネルには描いた線が表示されていません。

paintComponetはつづりが違いますし、JFrameにはありません。
つまり呼ばれることはありません(savePicのようにdoya91さんが定義した独自メソッド扱いです)
@Overrideをつけるようにすれば、こういったミスを防げます。

paintComponentを使うためにPainting extends JPanelとして、DrawPanelのかわりにするのがいいでしょうか。
JComponent#paintComponent (Java Platform SE 8 )

また、画面をクリアして描きなおす機能もうまく稼働できません。

bufferGraphicsに描いているのですから、当然クリアする処理がいるでしょう。

Java

1import java.awt.BasicStroke; 2import java.awt.BorderLayout; 3import java.awt.Color; 4import java.awt.Dimension; 5import java.awt.Graphics; 6import java.awt.Graphics2D; 7import java.awt.event.ActionEvent; 8import java.awt.event.ActionListener; 9import java.awt.event.MouseAdapter; 10import java.awt.event.MouseEvent; 11import java.awt.image.BufferedImage; 12import java.io.File; 13import java.io.IOException; 14import javax.imageio.ImageIO; 15import javax.swing.JButton; 16import javax.swing.JFrame; 17import javax.swing.JPanel; 18 19 20public class Painting extends JPanel implements ActionListener { 21 public static void main(String[] args) { 22 new Painting(); 23 } 24 25 private final String name = "test"; 26 private final int width = 400; 27 private final int height = 400; 28 private final JButton ButtonSave = new JButton("Save"); 29 private final JButton ButtonClean = new JButton("Clean"); 30 31 private int startX, startY, endX, endY; 32 private final BufferedImage bufferImage; 33 private final Graphics2D bufferGraphics; 34 35 36 private Painting() { 37 JPanel sendPanel = new JPanel(); 38 sendPanel.add(ButtonSave); 39 sendPanel.add(ButtonClean); 40 41 setPreferredSize(new Dimension(width, height)); 42 43 // createBuffer 44 bufferImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 45 bufferGraphics = bufferImage.createGraphics(); 46 bufferGraphics.setBackground(Color.white); 47 bufferGraphics.clearRect(0, 0, width, height); 48 49 addMouseListener(new MouseAdapter() { 50 public void mousePressed(MouseEvent e) { 51 startX = e.getX(); 52 startY = e.getY(); 53 } 54 }); 55 56 addMouseMotionListener(new MouseAdapter() { 57 public void mouseDragged(MouseEvent e) { 58 endX = e.getX(); 59 endY = e.getY(); 60 61 bufferGraphics.setColor(Color.BLACK); 62 bufferGraphics.setStroke(new BasicStroke(5)); 63 bufferGraphics.drawLine(startX, startY, endX, endY); 64 65 startX = endX; 66 startY = endY; 67 repaint(); 68 } 69 }); 70 71 ButtonSave.addActionListener(this); 72 ButtonClean.addActionListener(this); 73 74 // set JFrame 75 JFrame frame = new JFrame(); 76 frame.setLocation(400, 200); 77 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 78 frame.add(this, BorderLayout.CENTER); 79 frame.add(sendPanel, BorderLayout.SOUTH); 80 frame.pack(); 81 frame.setVisible(true); 82 } 83 84 @Override public void paintComponent(Graphics g) { 85 super.paintComponent(g); 86 g.drawImage(bufferImage, 0, 0, this); 87 } 88 89 @Override public void actionPerformed(ActionEvent e) { 90 if (e.getSource() == ButtonSave) { 91 savePic(name + ".jpg"); 92 } else if (e.getSource() == ButtonClean) { 93 bufferGraphics.clearRect(0, 0, width, height); 94 repaint(); 95 } 96 } 97 98 private void savePic(String path) { 99 try { 100 ImageIO.write(bufferImage, "jpg", new File(path)); 101 } catch (IOException e) { 102 e.printStackTrace(); 103 } 104 } 105}

投稿2021/07/05 12:20

TN8001

総合スコア9862

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

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

doya91

2021/07/05 12:52

paintComponent及びJComponentとJPanelの関係性をもう一度見直して理解しました。 ありがとうございました。本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問