• ベストアンサー

Graphicsについて

Graphicsで描かれた線や図形は、ダブルバッファリングを使用しないと、ウィンドウのサイズを変更したり、別のウィンドウで覆ったりすると、描かれたものは消えてしまいます。 そこで今回JPanelを用いて、消えてしまわないようにしたいですが、 JPanel p = new JPanel(); Graphics g = p.getGraphics(); g.drawLine( x, x, y, y); のようにして、を実行すると上記の行為をすると消えてしまいます。JPanelはデフォルトでダブルバッファリングを備えているはずですよね。なぜなのでしょうか? どなたかご教授願います。宜しくお願いします。

  • Java
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • koki_m
  • ベストアンサー率83% (45/54)
回答No.2

「回答に対する補足」の回答です。 この部分を、 c.add(new PanelTest4()); JPanel p =new JPanel(); c.add(p); - - - - - - - - - - - - - - - - - - - - PanelTest4 p = new PanelTest4(); c.add(p); としてみてください。 要点はJPanelを拡張したクラスはJPanelにもなるので、わざわざ標準のJPanelを使う必要はありません。 拡張したクラスPanelTest4(クラスA?)にコンポーネントを追加していけば良いだけです。 ※書き込んであるソースコードはクラス名が間違ってるようです。

kamakuragengorou
質問者

お礼

動きました!すごい!ありがとうございます!!昨日一晩考えて全くだめだったのにほんとにありがとうございます。今後ともご教授を宜しくお願いしたいです。 クラス名間違ってましたね。紛らわしいことをしてしまし申し訳ありませんでした。 ありがとうございました。

その他の回答 (1)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

ダブルバッファリングの意味を間違えています。ダブルバッファリングは画像のちらつきなどを防ぐための技法であって、描いたものを保持しておくための技法ではありません。 描いたものを保持したいのならば、描いた画像または描画するための情報などを別に保持しておく必要があります。

kamakuragengorou
質問者

補足

ご返信ありがとうございます。そうだったのですか(;´Д`)とんだ勘違いをしてました。 ところでJPanelを継承した新たなクラス(クラス名:Aとします)で、paintComonentメソッドを使い、drawLineで1本線を引くとします。そしてJFrameを継承した別のクラス(クラス名:Bとします)に登録するにはどうすればいいのでしょうか?コンテントペインを取得し、addで登録をすればいいのは分かるのですが、クラスBでJPanelを生成し、そのパネルにボタンやラベルを登録し、そのボタンやラベルをコンテントペインを取得してaddで登録すると、クラスAで描いた線が消えてしまい、クラスBのボタンやラベルに置き換わっています。私としては両方とも残ってほしいのですが、どうすればよいでしょうか?もしよろしければご教授ねがいたいです。何度もすみません。 以下はプログラムです。 import java.awt.*; import java.awt.event.*; import javax.swing.*; class A extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); int x; for(x=0; x<=240; x=x+20) { g.drawLine(0, 0, x, 240); } } } class B extends JFrame { public FrameTest4() { setSize(300, 300); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); Container c = getContentPane(); c.add(new PanelTest4()); JPanel p =new JPanel(); c.add(p); p.setLayout(null); JLabel lb = new JLabel("ラベル"); p.add(lb); lb.setBounds(50,50,50,50); } } public class Test4 { public static void main(String[] args) { JFrame a = new A(); a.show(); } } 長文ですみません。ぜひよろしくお願いします。

関連するQ&A

  • 線の太さを変える コードのエラの意味が分かりません

     java勉強中の初心者です、宜しくお願いします。  下のようなコードを書きましたが、  >DrawPanel dp = new DrawPanel( X1 , Y1 , X2 , Y2 ) ;  >g2.setStroke( の二か所でエラーが出ています。 (エラーの内容はよく理解できません。) 一体どこが間違っているのでしょうか宜しくお願いします。 ================================================================= public class drawLine extends JApplet { int X1 = 20 , Y1 = 20 , X2 = 150 , Y2 = 150 ; public void init() { DrawPanel dp = new DrawPanel( X1 , Y1 , X2 , Y2 ) ; // dp.setSize( 30 , 200 ) ; // dp.setBackground( Color.cyan ) ; this.add( dp ) ; this.setBounds( 10 , 10 , 400 , 400 ) ; this.setBackground( Color.cyan ) ; this.setVisible( true ) ; } } //======================================================= class DrawPanel extends JPanel { Float currentWidth = 20.0f ; int x1 , y1 , x2 , y2 ; public DrawPanel( int x1 , int y1 , int x2 , int y2 ) { this.x1 = x1 ; this.y1 = y1 ; this.x2 = x2 ; this.y2 = y2 ; Graphics2D g2 = (Graphics2D)this.getGraphics() ; g2.setStroke ( new BasicStroke ( currentWidth , BasicStroke.CAP_ROUND , BasicStroke.JOIN_MITER ) ) ; g2.setColor( Color.red ) ; g2.drawLine( x1 , y1 , x2 , y2 ) ; } } ==============================================================================

  • f(x)=xのf'(x)と∫f(x)dxのグラフ化

    f(x)=xのf'(x)と∫f(x)dxのグラフ化したいのですがここからどうすればいいのか分からず足踏みしてます。ご教授ください。 積分区間は0~xです。 import java.awt.*; import java.awt.event.*; public class graphics0 extends Frame { // コンストラクタ public graphics0(){ setSize(500, 500); setVisible(true); setTitle("graphics0"); // メッセージ処理 addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } // メインメソッド public static void main(String[] args){ new graphics0(); } // ペイントメソッド public void paint(Graphics g){ //ここに絵をかくコードを書く // 中心座標 int ox = 250; int oy = 250; // グラフの幅 int width = 200; int height = 200; //直線描画のための2点(x0,y0), (x1, y1) double x0, y0; double x1, y1; // 刻み幅 double d = 0.001; double n = (int) (1.0 / d); // 軸の描画 g.drawLine(50, 250, 450, 250); g.drawLine(250, 50, 250, 450); x0 = 0; y0 = 0; x1 = d; for(int i = 0; i < n; i++){ y1 = x1 * x1; g.drawLine( (int) (x0 * width) + ox, -((int)(y0 * height) -oy), (int) (x1 * width) + ox, -((int) (y1 * height) - oy)); x0 += d; x1 += d; y0 = y1; } } } よろしくお願いいたします。

  • シンボルを見つけられません

    javaについて勉強しているのですが、円の中に四角を作るというプログラムを作ろうとしたところ tes.java:43:シンボルを見つけられません。 シンボル:メソッド drawSquare(int,int,int,java.awt.Graphics) 場所:Assortのクラス a.drawSquare(x,y,w,g); ^ というエラーが出てコンパイルできません。drawCircleからdrawSquareを実行するようにしたいのですが、どうしたらよいか教えていただけないでしょうか。 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class tes { static MyCanvas mc; public static void main(String[] args) { tes ac_listener = new tes(); JFrame jf = new JFrame("tes"); JPanel p = new JPanel(); mc = new MyCanvas(); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mc.setPreferredSize(new Dimension(700,700)); jf.getContentPane().add(mc); p.add(mc); jf.getContentPane().add(p); jf.pack(); jf.setVisible(true); } } abstract class Assort{ double x,y; } class Square extends Assort{ public void drawSquare(int x, int y, int w, Graphics g) { double k=Math.sqrt(2); double _w=w/2/k; g.drawRect(x-(int)_w/2, y-(int)_w/2, (int)_w, (int)_w); } } abstract class Circle extends Assort{ } class Circle1 extends Circle { Assort a; Circle1(Assort _a) { a = _a; } void drawCircle(int x, int y, int w, Graphics g){ g.drawOval(x-w/4,y-w/4,w/2,w/2); a.drawSquare(x,y,w,g); } } class MyCanvas extends JPanel { public void paintComponent( Graphics g ) { super.paintComponent(g); Circle1 d1 = new Circle1 ( new Square() ); d1.drawCircle(350,350,700,g); } }

    • ベストアンサー
    • Java
  • ダブルバッファリング

    ダブルバッファリングを使ったつもりですが、キー操作するたびに画面がチカチカします。 特に <applet code="test.class" width="1600" height="600"> とした場合、repaint()メソッドを何回も呼んだ時に激しいです。 以下、ソースですが間違っているでしょうか? // ダブルバッファリング private Image imgOff; // オフイメージ private Graphics graOff; // オフグラフィックス public void paint(Graphics g){ if (imgOff == null) { Dimension dim = getSize(); imgOff = createImage( dim.width, dim.height ); graOff = imgOff.getGraphics(); } // ここに何か書く 例) graOff.setColor( new Color(255,255,255) ); graOff.fillRect(0, 0, 1600, 600); // 画面に反映 g.drawImage(imgOff,0,0,this); }

    • ベストアンサー
    • Java
  • javaでgraphicsの描画の件

    今日は javaでgraphicsの描画を行っていますが、CENTERのペインには、描画できますが、 それ以外のペイン(NORTH,WEST、EAST,、SOUTH)には、描画できないように思います。 Q1)この件について、コメント頂けますと大変助かります。 下記に、ソースコードを添付いたします。 =================== package pkg; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Line2D; import javax.swing.JFrame; import javax.swing.JPanel; public class SampleApp extends JFrame { public SampleApp(){ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(600, 300); this.add(new GPanel(), BorderLayout.WEST); this.add(new GPanel(), BorderLayout.CENTER); } public static void main(String[] args) { new SampleApp().setVisible(true); } } class GPanel extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); // int w = this.getWidth(); // int h = this.getHeight(); int w=200; int h=200; g.setColor(Color.RED); g.fillOval(0, 0, w/2, h/2); Graphics2D g2 = (Graphics2D)g; g2.draw(new Line2D.Double(40, 40, w,h)); g.setColor(Color.BLUE); g.setFont(new Font("Serif", Font.BOLD, 36)); g.drawString("Graphics draw!", 10, h - 50); // 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(8.0f); g2.setStroke(wideStroke); g2.draw(new Line2D.Double(30.0d, 120.0d, 250.0d, 70.0d)); } }

    • ベストアンサー
    • Java
  • ジャヴァのスウィングについて

    スウィングでg.drawLineなどのメソッドはどうすればつかえるのでしょうか。どうしてもわかりません。こうすればOKと思ったのですが Graphics g= new Graphics(); g.drawLine(20,20,30,30); みたいな。でもこれだとエラーになります。

    • ベストアンサー
    • Java
  • グラフィックDrawLineメソッドについて

    グラフィックDrawLineメソッドについて教えてください。 下記のコードでは、開いた線になります。OK mypoints(0)=New Point(10,10) ,mypoints(1)=New Point(40,70) mypoints(2)=New Point(60,30) mypoints(3)=New Point(90,90) Dim g As Graphics = PictureBox3.CreateGraphics() g.DrawLines(New Pen(Color.Blue, 1), mypoints) ところが、下記のコードで、グラフが最後閉じられてしまいます。NG どうしてでしょうか? For i = 0 To 48 mypoints(i) = New Point((i * 0.35), (PdaOneData(N_OneDtNo).PicData(i) * 0.05)) Debug.WriteLine(mypoints(i)) Next Dim g As Graphics = PictureBox3.CreateGraphics() g.DrawLines(New Pen(Color.Blue, 1), mypoints) 上記のmypoints(i) のイミディエイトウィンドウ表示は下記のとおりです。 X=0,Y=40}{X=0,Y=40}{X=1,Y=39}{X=1,Y=39}{X=1,Y=39}{X=2,Y=38}{X=2,Y=38}{X=2,Y=37}{X=3,Y=37}   ・・・中省略・・・ {X=14,Y=43}{X=14,Y=43}{X=15,Y=43}{X=15,Y=43}{X=15,Y=44}{X=16,Y=44}{X=16,Y=43}{X=16,Y=42}

  • Javaのダブルバッファリングについてお伺いしたいのですが、

    Javaのダブルバッファリングについてお伺いしたいのですが、 Thred.sleep(20) ペイント部 public void paint(Graphics g) { g.drawImage(wbuffer, int x, int y, this); } アップデートメソッド public void update(Graphics g) { paint(g); } 他のクラスからもこのwbufferの中にいったん書き込むようにしています。 チラつきが出る要因として考えられるのはどんなことがあるのでしょうか? ・オブジェクトの数が多い というのが原因でしょうか。 だいたい5秒おきくらいにチラつきが生じます。

    • ベストアンサー
    • Java
  • Graphics gra = this.getGraphics( );について

    public void drawPhotograph( ) { Graphics gra = this.getGraphics( ); if (image != null) { x = 0; y = 0; gra.drawImage(image,x,y,this); } } この場合、graの値がnullとなり、実行時に、NullPointer Exceptionが起こります。その原因は何なのでしょうか、また回避策はどのようにすればよいでしょうか?

  • 初心者です。 コンパイルのエラー

    import java.awt.*; import javax.swing.*; public class R11Sample1 extends JFrame { Rect r1 = new Rect(Color.red, 100, 100, 80, 60); Rect r2 = new Rect(new Color (0.5f, 1f, 0f, 0.7f), 150, 120, 60, 90); Oval = new Oval(Color.blue, 60, 50, 10, 10); JPanel panel = new JPanel() { public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; r1.draw(g2); r2.draw(g2); } }; public R11Sample1() { setSize(400, 350); setDefaultCloseOperation(EXIT_ON_CLOSE); getContentPane().add(panel); } public static void main(String[] args) { new R11Sample1().setVisible (true); } } class Rect { Paint pat; int xpos, ypos, width, height; public Rect(Paint p, int x, int y, int w, int h) { pat = p; xpos = x; ypos = y; width = w; height = h; } public void draw(Graphics2D g) { g.setPaint(pat); g.fillRect(xpos-width/2, ypos-height/2, width, height); } } class Oval { Paint pat; int xpos, ypos, radius; public Oval(Paint p, int x, int y, int width, int height) { pat = p; xpos = x; ypos = y; width = w; height = h; } public void draw(Graphics2D g) { g.setPaint(pat); g.fillOval(xpos-width/2, ypos-height/2, width, height); } } これでコンパイルすると、 Identifierがありません といわれました。 どこを直せばいいのでしょうか。 また、全体的に間違ったところがあったら教えてください。

    • ベストアンサー
    • Java

専門家に質問してみよう