前提
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}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/05 12:52