現在javaでお絵描きソフトを勉強しているのですが、自分で描いた絵を画像として保存する機能を付けたいと思い、質問させていただきました。
まだまだプログラムには弱くどのようにすればいいのかわからないので、詳しく教えていただけると幸いです。
該当のソースコード
java
1import java.awt.BasicStroke; 2import java.awt.BorderLayout; 3import java.awt.Color; 4import java.awt.Graphics; 5import java.awt.Graphics2D; 6import java.awt.Image; 7import java.awt.Paint; 8import java.awt.RenderingHints; 9import java.awt.event.ActionEvent; 10import java.awt.event.ActionListener; 11import java.awt.event.MouseAdapter; 12import java.awt.event.MouseEvent; 13import java.awt.event.MouseMotionAdapter; 14 15import javax.swing.ButtonGroup; 16import javax.swing.JButton; 17import javax.swing.JComponent; 18import javax.swing.JFrame; 19import javax.swing.JLabel; 20import javax.swing.JPanel; 21import javax.swing.JToggleButton; 22 23public class SwingPaint extends JFrame { 24 private final DrawArea drawArea = new DrawArea(); 25 26 public static void main(String[] args) { 27 new SwingPaint().setVisible(true); 28 } 29 30 private SwingPaint() { 31 super("お絵かき"); 32 setSize(600, 600); 33 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 34 setLocationRelativeTo(null); // 中央表示 35 setResizable(false); // リサイズ禁止 36 37 JButton clearBtn = new JButton("Clear"); 38 clearBtn.addActionListener(e -> drawArea.clear()); 39 JPanel panel = new JPanel(); 40 panel.add(clearBtn); 41 42 JPanel controls = new JPanel(new BorderLayout()); 43 controls.add(createColorButtons(), BorderLayout.NORTH); 44 controls.add(createSizeButtons(), BorderLayout.CENTER); 45 controls.add(panel, BorderLayout.EAST); 46 47 add(controls, BorderLayout.NORTH); 48 add(drawArea, BorderLayout.CENTER); 49 } 50 51 private JPanel createColorButtons() { 52 JToggleButton green = new JToggleButton("緑"); 53 JToggleButton blue = new JToggleButton("青"); 54 JToggleButton black = new JToggleButton("黒", true); // 初期選択 55 JToggleButton red = new JToggleButton("赤"); 56 JToggleButton magenta = new JToggleButton("マゼンタ"); 57 JToggleButton white = new JToggleButton("消しゴム"); 58 59 ActionListener actionListener = new ActionListener() { 60 @Override public void actionPerformed(ActionEvent e) { 61 if (e.getSource() == black) { 62 drawArea.setStrokeColor(Color.BLACK); 63 } else if (e.getSource() == blue) { 64 drawArea.setStrokeColor(Color.BLUE); 65 } else if (e.getSource() == green) { 66 drawArea.setStrokeColor(Color.GREEN); 67 } else if (e.getSource() == red) { 68 drawArea.setStrokeColor(Color.RED); 69 } else if (e.getSource() == magenta) { 70 drawArea.setStrokeColor(Color.MAGENTA); 71 } else if (e.getSource() == white) { 72 drawArea.setStrokeColor(Color.WHITE); 73 } 74 } 75 }; 76 77 ButtonGroup group = new ButtonGroup(); // 同じグループに入れると勝手にトグルしてくれる 78 JPanel controls = new JPanel(); 79 controls.add(new JLabel("Color")); 80 81 JToggleButton[] buttons = new JToggleButton[]{ green, blue, black, red, magenta,white }; 82 for (JToggleButton button : buttons) { 83 button.addActionListener(actionListener); 84 group.add(button); 85 controls.add(button); 86 } 87 88 return controls; 89 } 90 91 private JPanel createSizeButtons() { 92 JToggleButton stroke1 = new JToggleButton("1", true); 93 JToggleButton stroke5 = new JToggleButton("5"); 94 JToggleButton stroke10 = new JToggleButton("10"); 95 JToggleButton stroke20 = new JToggleButton("20"); 96 97 ActionListener actionListener = new ActionListener() { 98 @Override public void actionPerformed(ActionEvent e) { 99 if (e.getSource() == stroke1) { 100 drawArea.setStrokeSize(1); 101 } else if (e.getSource() == stroke5) { 102 drawArea.setStrokeSize(5); 103 } else if (e.getSource() == stroke10) { 104 drawArea.setStrokeSize(10); 105 } else if (e.getSource() == stroke20) { 106 drawArea.setStrokeSize(20); 107 } 108 } 109 }; 110 111 ButtonGroup group = new ButtonGroup(); 112 JPanel controls = new JPanel(); 113 controls.add(new JLabel("Size")); 114 115 JToggleButton[] buttons = new JToggleButton[]{ stroke1, stroke5, stroke10,stroke20 }; 116 for (JToggleButton button : buttons) { 117 button.addActionListener(actionListener); 118 group.add(button); 119 controls.add(button); 120 } 121 122 return controls; 123 } 124} 125 126class DrawArea extends JComponent { 127 private Image image; 128 private Graphics2D g2; 129 private int oldX, oldY; 130 131 public DrawArea() { 132 setDoubleBuffered(false); 133 addMouseListener(new MouseAdapter() { 134 @Override public void mousePressed(MouseEvent e) { 135 oldX = e.getX(); 136 oldY = e.getY(); 137 } 138 }); 139 140 addMouseMotionListener(new MouseMotionAdapter() { 141 @Override public void mouseDragged(MouseEvent e) { 142 int currentX = e.getX(); 143 int currentY = e.getY(); 144 145 g2.drawLine(oldX, oldY, currentX, currentY); 146 repaint(); 147 148 oldX = currentX; 149 oldY = currentY; 150 } 151 }); 152 } 153 154 protected void paintComponent(Graphics g) { 155 if (image == null) { 156 image = createImage(getWidth(), getHeight()); 157 g2 = (Graphics2D) image.getGraphics(); 158 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 159 clear(); 160 } 161 162 g.drawImage(image, 0, 0, null); 163 } 164 165 public void clear() { 166 Paint p = g2.getPaint(); // 元の色 167 g2.setPaint(Color.WHITE); 168 g2.fillRect(0, 0, getWidth(), getHeight()); 169 g2.setPaint(p); // 元の色に戻す 170 repaint(); 171 } 172 173 public void setStrokeColor(Color color) { g2.setPaint(color); } 174 175 public void setStrokeSize(int size) { 176// g2.setStroke(new BasicStroke(size)); // だけだとギザギザが汚い 177 g2.setStroke(new BasicStroke(size, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 178 } 179
どうかお願いします。
今何がどこまでできていて何が起きてるのでしょうか。
「質問した」と書いてあるだけで質問になっていませんし、要件だけでしたら調べて何も出ないように思えません(要は丸投げです)

回答2件
あなたの回答
tips
プレビュー