現在画面をすべて消すリセットボタンを作ろうとしています。
それにつきましてまだ、Graphicsの理解が浅く扱いがうまくいかずできないです。
import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class Test1 { public static void main(String[] args) { main a = new main(); a.setVisible(true); } } class main extends JFrame implements ActionListener{ main(){ super("描写テスト");//タイトル this.setSize(400,400);//大きさ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//終了 JPanel kabe = new JPanel();//パネル作成 JButton osu =new JButton("押す");//ボタン作成 remove(osu); osu.addActionListener(this);//ボタンにイベントをプラス kabe.setLayout(new BorderLayout());//壁をセット kabe.add(osu,BorderLayout.EAST);//壁にボタンを配置 getContentPane().add(kabe,BorderLayout.EAST);//本体にパネルを設置 this.add(new event(), BorderLayout.CENTER);//真ん中にイベントを設置 } public void actionPerformed(ActionEvent e){//ボタンイベント // System.out.println("aaa");//確認用 event gura = new event(); gura.kanri(); gura.repaint(); } } class event extends JPanel implements MouseListener, MouseMotionListener{ int lastMouseX = -100;//移動距離 int lastMouseY = -100; int start_x = -100;//スタート地点座標 int start_y = -100; static boolean flag = false;//全体の管理 BasicStroke BStroke = new BasicStroke(5.0f);//筆の大きさを設定 BufferedImage seve_field = new BufferedImage(600,600, BufferedImage.TYPE_4BYTE_ABGR);//メモリの確保 Graphics seve = seve_field.createGraphics();//メモリへの窓口 event() { addMouseListener(this);//中央にマウスイベントを配置 addMouseMotionListener(this);//同上 } @Override public void paintComponent(Graphics g) { if(flag) { System.out.println("ifルート");//確認用 flag = false;//戻し seve_field = null;//メモリの中を破棄 seve = null;//seveを破棄 g.dispose() ;//gの中身を破棄 repaint(); }else{ seve = seve_field.createGraphics();//メモリへの窓口 // System.out.println("描写");//確認用 Graphics2D g2= (Graphics2D)g;//2Dに変更 g2.setStroke(BStroke);//線の設定 g2.setColor(Color.RED);//線の色 Graphics2D seve2= (Graphics2D)seve;//メモリ加工 seve2.setStroke(BStroke);//線の設定 seve2.setColor(Color.RED);//線の色 if(start_x==-100||start_y== -100||lastMouseX==-100||lastMouseY==-100) { lastMouseX = lastMouseY = start_x = start_y = -100; } g.drawImage(seve_field,200,300,this);//g2の中身をメモリの大きさだけゲット seve2.drawImage(seve_field,0,0,this);//メモリの絵を投下 seve2.drawLine(start_x, start_y, lastMouseX, lastMouseY);//線を引く g2.drawLine(start_x, start_y, lastMouseX, lastMouseY);//メモリに線を引く start_x = lastMouseX;//スタート地点の変更 start_y = lastMouseY;}//同上 } public boolean kanri() { lastMouseX = lastMouseY = start_x = start_y = -100; flag = true;//フラグ設定 return flag; } @Override public void mousePressed(MouseEvent e) { /*初期位置の保存*/ start_x = lastMouseX = e.getX(); start_y = lastMouseY = e.getY(); flag = false; } @Override public void mouseReleased(MouseEvent e) { lastMouseX = lastMouseY = start_x = start_y = -100; } @Override public void mouseDragged(MouseEvent e) { lastMouseX = e.getX(); lastMouseY = e.getY(); repaint(); } @Override public void mouseClicked(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mouseMoved(MouseEvent e) { } }
自分の頭の中では、
1、ボタンを押すとfalseを返す。
2、gとseveの中身を消している。
3、repaint()でgが空っぽなのでまっさらな画面になっている。
4その後trueになってdrawImageをしてもgおよびメモリの中身がないのでまっさらになってる。
の想定です。
しかしなっていません。
どこら辺の考えが間違っているのでしょうか。
理解を深めたいのでアドバイスをお願いします。
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2017/05/11 00:33
2017/05/11 01:57
2017/05/11 14:43
2017/05/11 14:57
2017/05/11 21:20