※ ChatGPTを利用し、要約された質問です(原文:javaのCanvasを使用する描画)
キャンバスの内容を残しつつ書き込む方法について
このQ&Aのポイント
キャンバスの内容をクリヤーすることなく、既に書込んだキャンバスの内容を残しながら、新規に書込む方法はありますか?
JavaのCanvasを使用して描画を行なっていますが、painルーチンが起動するたびにキャンバスの内容がクリヤーされ、新たに書き込みが行われてしまいます。キャンバスの内容を残したまま書き込む方法を教えてください。
Canvasの上に書き込む際に、既に描画されている図形を消去せずにそのまま残したまま新たに書き込む方法を教えてください。
今日は!
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));
}
}
}
}
お礼
早速のご回答有難う御座います。 ご指摘いただきましたように、改善しまして、旨く行きました。