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

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

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

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

Swing

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

Q&A

解決済

1回答

3293閲覧

Java ウィンドウを表示したときに内容を再表示したい 簡易ペイントソフト

EEE

総合スコア11

Java

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

Swing

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

0グッド

0クリップ

投稿2019/12/09 11:13

編集2019/12/09 12:25

javaでマウス操作で描画できるペイントのようなものを作っています。
ウィンドウを非表示にして、再表示させると描いた内容が消えてしまう状態です。
原因は、ウィンドウその物に描いている状態で、どこにも保存されていないから再表示したときに消えてしまうのだと思います。
私が考えている解決方法として、マウス操作によって描画されたときに、保存する何かに上書きして、ウィンドウを閉じて開いたときに保存されたものを表示できればいいと思っています。
しかし、今描いているものをファイルに保存するやり方と、ウィンドウを「開いたとき」に保存されたものを表示するという命令をどのように実現できるか分からず困っています。
皆様のお力をおかしください。よろしくお願いします。

java

1import java.awt.*; 2import java.awt.event.*; 3import javax.swing.*; 4import javax.swing.event.*; 5 6public class MyPanel extends JPanel implements MouseListener,MouseMotionListener{ 7 private int xold,yold; 8 private int color; 9 private boolean drawFlag = true; 10 11 //セッター 12 public void setColor(int color){ 13 this.color = color; 14 } 15 public void setDrawFlag(boolean drawFlag){ 16 this.drawFlag = drawFlag; 17 } 18 19 public MyPanel(){ 20 setBackground(Color.white); // 背景を白に設定 21 setPreferredSize(new Dimension(640, 480)); 22 this.addMouseListener(this);//クリック 23 this.addMouseMotionListener(this);//カーソル 24 } 25 26 public void mousePressed(MouseEvent e) { 27 this.xold = e.getX(); 28 this.yold = e.getY(); 29 30 //stamp 31 if(this.drawFlag == false){ 32 Graphics g = this.getGraphics(); 33 g.drawOval(this.xold, this.yold, 128, 64); 34 } 35 } // マウスボタンが押されたとき 36public void mouseReleased(MouseEvent e) {} // マウスボタンが離されたとき 37 public void mouseClicked(MouseEvent e) {} // マウスボタンがクリックされた(押して離された)とき 38 public void mouseEntered(MouseEvent e) {} // マウスカーソルが部品内に入ったとき 39 public void mouseExited(MouseEvent e) {} // マウスカーソルが部品外に出たとき 40 41 public void mouseMoved(MouseEvent e) {} // マウスが動いたとき 42 public void mouseDragged(MouseEvent e) { 43 int x = e.getX(); // マウスカーソルのX座標と 44 int y = e.getY(); // Y座標を調べ 45 if(this.drawFlag == true){ 46 Graphics g = this.getGraphics(); // OSからペンを借り 47 if(this.color == 1){g.setColor(Color.BLACK);} 48 if(this.color == 2){g.setColor(Color.WHITE);} 49 if(this.color == 3){g.setColor(Color.RED);} 50 if(this.color == 4){g.setColor(Color.BLUE);} 51 g.drawLine(this.xold, this.yold, x, y); // マウスカーソルの位置に図形を描画する 52 g.dispose(); 53 this.xold = x; 54 this.yold = y; 55 } 56 } // マウスがドラッグされたとき 57}

java

1import java.awt.*; 2import java.awt.event.*; 3import javax.swing.*; 4import javax.swing.event.*; 5 6public class MyFrame extends JFrame implements ActionListener{ 7 private MyPanel mp; 8 private JButton b1,b2,b3,b4; 9 private JRadioButton rb1,rb2; 10 11 public MyFrame(){ 12 JPanel panel1 = new JPanel(); 13 FlowLayout flow1 = new FlowLayout(); 14 this.mp = new MyPanel(); 15 this.b1 = new JButton("黒"); 16 this.b2 = new JButton("白"); 17 this.b3 = new JButton("赤"); 18 this.b4 = new JButton("青"); 19 this.rb1 = new JRadioButton("pen",true); 20 this.rb2 = new JRadioButton("stamp"); 21 ButtonGroup group = new ButtonGroup(); 22 group.add(this.rb1); 23 group.add(this.rb2); 24 25 panel1.setLayout(flow1); 26 panel1.add(this.rb1); 27 panel1.add(this.rb2); 28 panel1.add(this.b1); 29 panel1.add(this.b2); 30 panel1.add(this.b3); 31 panel1.add(this.b4); 32 panel1.add(this.mp); 33 getContentPane().add(panel1); 34 this.b1.addActionListener(this); 35 this.b2.addActionListener(this); 36 this.b3.addActionListener(this); 37 this.b4.addActionListener(this); 38 this.rb1.addActionListener(this); 39 this.rb2.addActionListener(this); 40 } 41 public void actionPerformed(ActionEvent e){ 42 if(e.getSource() == this.b1){ 43 this.mp.setColor(1); 44 } 45 if(e.getSource() == this.b2){ 46 this.mp.setColor(2); 47 } 48 if(e.getSource() == this.b3){ 49 this.mp.setColor(3); 50 } 51 if(e.getSource() == this.b4){ 52 this.mp.setColor(4); 53 } 54 55 if(e.getSource() == this.rb1){ 56 this.mp.setDrawFlag(true); 57 } 58 if(e.getSource() == this.rb2){ 59 this.mp.setDrawFlag(false); 60 } 61 } 62 63 public static void main(String[] args){ 64 MyFrame w = new MyFrame(); 65 w.setTitle("マウス操作でラインを引く"); 66 w.setSize(650,500); 67 w.setLocation(100,100); 68 w.setVisible(true); 69 w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 70 } 71} 72 73

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

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

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

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

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

jimbe

2019/12/09 11:34 編集

ファイルへの保存方法は大きく二つあります. 一つは, 表示している画像を(bmp形式等で)保存する方法, もう一つは描画した線の座標・色を保存する方法です. 前者は保存したデータを他のソフトで利用できます. 後者はデータ量が(おそらくは)かなり少なくなります. また, ウインドウを最小化して戻した場合の再描画と, ソフトを終了して再起動した時の初期描画は(通常は)処理が異なります. この辺りはどのようにお考えでしょうか.
jimbe

2019/12/09 11:38

ご質問に付けられた canvas タグは HTML のものです. 関係ありませんので外されたほうが良いかと思います.
jimbe

2019/12/09 11:53

全く関係ない事柄なのですが, > if(this.color == 1){g.setColor(Color.BLACK);} ありがちかと思いますが, このような書き方をされるのであれば最初から this.color を Color 型にしてボタン側で setColor(1) を setColor(Color.BLACK) としてしまえば, if 文は要らず g.setColor(this.color) で済んでしまうと思います. そのボタン側にしても, MyFrame.actionPerformed に全てのボタンの処理を一旦集めてから e.getSource() で再度振り分けるよりも, this.b1.addActionListener(this) の時点で無名クラスで処理を書いたほうが宜しいかと思います. ラムダ式が使えれば, this.b1.addActionListener(e -> mp.setColor(Color.BLACK)); と更に簡単になります.
EEE

2019/12/09 12:34

回答ありがとうございます。 保存方法に関しては、画像として保存しようと考えています。 初期描画に関しては、はっきり言って方法がわかっていない状態です。 if文はラムダ式が今のところ経験ないので、調べた使ってみたいと思います。
ngsvx

2019/12/09 15:14

画像で持っていると、例えば「書いた線の位置や色を後で変更する」などができないですけど。 undoに関しては一応不可能ではないですが、処理結果毎に画像を持つ必要があるので、メモリを消費しそうですね。 jimbeさんの後者の方法で持っておき、画像を出力(エクスポート)できるようにするのがいいのでは?
EEE

2019/12/10 13:17

実際どのように記述すればいいか、どのメソッド?を使えばいいかわかっていません。 どのような命令で実現可能でしょうか? よろしくお願いします。
ngsvx

2019/12/10 15:35

jimbeさんが見つけたサイトが前者の方法のようですので、それを見れば解決ですね。
EEE

2019/12/14 11:28

そうですね。 ありがとうございました!
guest

回答1

0

ベストアンサー

ウインドウの再描画に関しまして「java swing お絵かき 再描画」で検索しますと,
JavaのJFrame・Canvasクラスの使い方と応用
が見つかりました.
参考になればと思います.

投稿2019/12/09 16:48

jimbe

総合スコア12632

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

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

EEE

2019/12/10 13:16

そのまま検索したら出てきたんですねw 私の検索のやり方が悪かったですwお恥ずかしいです>_< ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問