今日は! repaintからCanvasの中のpaintルーチンを起動して描画を行なっています。 (下記のプログラム参照) ボタンを押すごとに、キャンバスに違った内容の書込みを行ないます。 painルーチンが起動する度に、既に書込んだキャンバスの内容がクリヤーされて 新規にキャンバスに書込みが行われて居ると思います。 Q1)キャンバスの内容をクリヤーすることなく、既に書込んだキャンバスの内容を 残して、その上に書込む方法はありませんか? (クリヤーのための指令は、出していないと思っています) ご教授の程、宜しくお願いします。 //================================ import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Line2D; import javax.swing.JFrame; import javax.swing.JPanel; public class ShapeTest1 extends JFrame{ int sw=0; myCanvasPanel myCanvas; public static void main(String[] args){ // JFrame frame = new JFrame(); ShapeTest1 frame=new ShapeTest1(); } ShapeTest1(){ JFrame frame=new JFrame(); // ShapeTest1 app = new ShapeTest1(); // frame.getContentPane().add(app); frame.setTitle("タイトル"); frame.setBounds(10, 10, 300,220); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // frame.setVisible(true); //North========================= JPanel p1=new JPanel(); myCtlPanel myCtl=new myCtlPanel(p1) ; // frame.getContentPane().add(p1,BorderLayout.SOUTH); frame.getContentPane().add(p1,BorderLayout.NORTH); //===================================== JPanel p2=new JPanel(); myCanvas=new myCanvasPanel(p2); p2.add(myCanvas); frame.getContentPane().add(p2,BorderLayout.CENTER); frame.setVisible(true); } //=========================== class myCtlPanel extends JFrame{ myCtlPanel(JPanel p){ /* //領域のサイズ設定 setSize(300,50); //領域のサイズ取得 Dimension dimension = getSize(); */ Button button1=new Button("button1"); button1.addActionListener(new TimButton1()); p.add(button1); } } class TimButton1 implements ActionListener{ @Override public void actionPerformed(ActionEvent ae){ if(sw==0){ sw=1; } else{ sw=0; } myCanvas.repaint();//ng System.out.println("TimButton1 sw="+sw); } } class myCanvasPanel extends Canvas{ myCanvasPanel(JPanel p){ //領域のサイズ設定 setSize(300,150); //領域のサイズ取得 Dimension dimension = getSize(); //p.add(this); } // public void paintComponent(Graphics g){//repaint()では、起動されない public void paint(Graphics g){//repaint()では、起動 Graphics2D g2 = (Graphics2D)g; System.out.println("Paint sw="+sw); if(sw==0){ //================================================ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.draw(new Line2D.Double(30.0d, 50.0d, 180.0d, 140.0d)); //============================================== g2.setPaint(Color.PINK); BasicStroke wideStroke = new BasicStroke(4.0f); g2.setStroke(wideStroke); g2.draw(new Line2D.Double(30.0d, 120.0d, 250.0d, 70.0d)); } else{ g2.setPaint(Color.RED); BasicStroke wideStroke = new BasicStroke(4.0f); g2.setStroke(wideStroke); g2.draw(new Line2D.Double(30.0d, 120.0d, 250.0d, 140.0d)); } } } }
↧