こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

javaの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));
}
}
}
}

投稿日時 - 2015-01-10 17:18:02

QNo.8886634

困ってます

質問者が選んだベストアンサー

public void paint(Graphics g){//repaint()では、起動

の呼び出しはupdate(Graphics g) で行っていなす。

public void update(Graphics(g){
g.setColor(getBackground());
g.fillRect(0,0,d.width,d.d.height);
g.setColor(getForeground());
paint(g);
}

となっています。

これでは前のが消えてしまいますよね。

public void update(Graphics g){
paint(g);
}

を追加すれば前のが残リます。

投稿日時 - 2015-01-10 17:46:57

お礼

早速のご回答有難う御座います。
ご指摘いただきましたように、改善しまして、旨く行きました。

投稿日時 - 2015-01-10 17:58:52

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問