• 締切済み

JavaのJFrameについて

いまJavaでパソコンに表示する時計を作っています。 JFrameを使っているのですが、ダブルバッファリングで描写しながらSwingのJButtonを使いたいのですが、今自分の知ってる方法だとうまく行きません。 ひとつは、 repaint()関数とpaint()関数を使う方法です。 この方法だとダブルバッファリングのままJButtonと同梱させることができるのらしいですが、表示が滑らかじゃありません。自分的にはFPSが60はほしいです。 もう一つの方法は、graphicsクラスを使って描写する方法です。 こちらはFPS的に問題はないのですがJButtonが置けません。 要点をまとめると、 Graphicsによる描写とSwingのJButtonを同時に一つのwindowでつかいたい、 描写速度をFPS 60程度にしたい です。 書き方が雑なので質問の意図が伝わりにくいかと思いますが、回答よろしくお願いします

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

みんなの回答

  • OKTaro-
  • ベストアンサー率50% (36/72)
回答No.2

paint関数を使うとJButtonを同梱出来ないという点が良くわからないのですが 下記のようにJFrameのpaintをオーバーライドするとチラつくという事ですか? public void paint(Graphics g) { // 時計描画処理 super.paint(g) // JButtonの描画処理を行わせる } とすると、以下の方法でどうでしょうか? ・JFrame>JPanel>JButtonという階層にしてJPanelのpaintComponentに時計描画処理を入れる ・オフスクリーンバッファを用意して、JFrame.paint内ではオフスクリーンバッファの内容を描きだすようにする

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

FPSの件は(私はAppletでやっていますが、repaint()関数とpaint()関数は同じだと思います。) update()で背景色で塗りつぶしてからpaint()を呼んでいますので、 public void update(Graphics g){ paint(g); } で上書きし、 public void paint(Graphics g) { gで受け取って Image offs; Graphics grf; を作り、ここで本来gに対する処理をgrfに対してかき、 g.drawImage(offs,0,0,this); でgに返せばチカチカしません。 run()は使っていらっしゃいますか? public void run() { while(kicker != null) { repaint(); try { Thread.sleep(100); } catch(InterruptedException e) {} } } ここのsleep時間(ミリ秒)を短くすれば早くなります。 run()→repaint()→update()→paint()になります。

関連するQ&A

  • Java JFrameにJPanelを・・・

    こんにちは。趣味でプログラミングをしているものです。 さっそくですが、質問させていただきます。 Java で電卓を作っているのですが、 文具店で1000円くらいで販売している電卓を再現したいのですが、 いろいろなボタンの操作はなんとなくわかってきたのですが、 電卓のGUIについて質問させていただきます。 JFrame を継承したクラスに背景の画像を描画し その上に、計算の経過、結果を表示するJPanelを 継承したクラスのインスタンスを 特定の座標に配置したいのですが、 うまくいきません。 以下に自分の作ったコードを載せますので、 どこが悪いのか、教えていただけないでしょうか。 よろしくお願いします。 package test01_frame; import java.awt.*; import javax.swing.*; public class TestFrame extends JFrame { Image bgimage; JPanel jp01; TestFrame() { super(); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setSize( 384, 576 ); setLocationRelativeTo( null ); bgimage = new ImageIcon( "images/image01.jpg").getImage(); repaint(); //コメントアウトした部分がわからない箇所です。 //jp01 = new JPanel(); //jp01.setPreferredSize( new Dimension( 360, 50 )); //jp01.setBackground(Color.RED); //add( jp01 ); //jp01.setLocation( new Point( 10, 30 )); setVisible( true ); } public void update( Graphics g ) { paint( g ); } public void paint( Graphics g ) { g.drawImage( bgimage, 0, 0, null ); } /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ new TestFrame(); } }

    • ベストアンサー
    • Java
  • JFrame の再表示を禁止したい。

    親ウィンドウのボタンを押して、子ウインドウが表示される仕組みなのですが、1 つ表示した後は、 表示させないようにしたいと考えコードを組みましたが、以下コードでは、null 例外が出てしまいます。 良い方法はありませんでしょうか? みなさん、どうぞよろしくお願い致します。 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class FramesTest { public static void main(String[] args) { JFrame frameMain = new JFrame("Main"); frameMain.setSize(256, 128); frameMain.getContentPane().add( new BT() ); frameMain.setVisible(true); } } class BT extends JPanel implements ActionListener { /** * */ private static final long serialVersionUID = 1L; /*-------------------------* * Variables. * *-------------------------*/ static String cmdName; static JButton button; static JFrame subJFrame; /*-------------------------* * Methods. * *-------------------------*/ BT() { super( new BorderLayout() ); button = new JButton("button"); button.addActionListener(this); add( button ); setPreferredSize(new Dimension(320, 100)); } void createFrame() { subJFrame = new JFrame( "sub" ); subJFrame.setVisible(true); subJFrame.setSize(256, 128); } @Override public void actionPerformed(ActionEvent e) { cmdName = e.getActionCommand(); if ("button".equals(cmdName)) { if ( !subJFrame.isActive() ) { createFrame(); } } } }

    • ベストアンサー
    • Java
  • repaint()が実行されません。

    repaint()が実行されません。 もともとあるJEditorPane上に画像表示させるために、他のクラスからrepaint()をよびだしてpaint()を実行させようとしているのですが、実行されません……。 以下にプログラムを表示します。 import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import java.io.IOException; public class Open extends JFrame {   public Open(){   }    public void paint(Graphics g){    System.out.println("paint開始");    Graphics2D g2 = (Graphics2D)g;    BufferedImage readImage = null;    try {    readImage = ImageIO.read(new File("sample.png"));    } catch (Exception e) {    e.printStackTrace();    readImage = null;    }      if (readImage != null){    g2.drawImage(readImage, 0, 0, this);    }    }    public void Fileload(){    System.out.println("再描写");    repaint();   } } 外部のクラスからFileload()を呼び出して実行すると"再描写"はコマンドプロンプト上に表示されるのですが"paint開始"は表示されません。なのでpaint()の呼び出しができていないのだと思うのですが……。 原因がわかりません……。 javaも質問も初心者なのでわかりづらいところがあるとは思いますが、どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • 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
  • javaのBoxlayoutについて

    下記はBoxLayout用ののコードです。 Q1)Buttonのサイズを設定する方法がありますか? Q2)Buttonの配置を設定する方法がありますか? //===================================== import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.LayoutManager; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class AlignmentX extends JFrame{ JButton button1; JButton button2; JButton button3; public static void main(String[] args){ AlignmentX frame = new AlignmentX(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("タイトル"); frame.setVisible(true); } AlignmentX(){ button1 = new JButton("AAAAA"); button1.setAlignmentY(0.5f); button1.setPreferredSize(new Dimension(80,20)); button2 = new JButton("BBB"); button2.setAlignmentY(0.5f); button2.setPreferredSize(new Dimension(80,20)); button3 = new JButton("CC"); button3.setAlignmentY(0.5f); button3.setPreferredSize(new Dimension(80,20)); JPanel p = new JPanel(); p.setLayout((LayoutManager) new BoxLayout(p, BoxLayout.Y_AXIS)); p.add(button1); p.add(button2); p.add(button3); getContentPane().add(p, BorderLayout.CENTER); setBounds(10, 10, 300, 200); } } //以上,宜しくお願いします。

    • ベストアンサー
    • Java
  • javaについて質問

    import javax.swing.*; import java.awt.Color; import java.awt.Graphics; import java.awt.event.*; public class tt extends JFrame { public tt(){ setTitle("hogehoge"); setBounds( 10, 10, 300, 200); JButton btn1 = new JButton("続ける"); final JPanel p = new JPanel(); p.setBackground(Color.white); btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event){ } } ); p.add(btn1); getContentPane().add(p); } public static void main(String[] args){ tt test = new tt(); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); /* 実際に表示する */ } } Graphics g; g.drawString("ほげさんじょう",130,120);を追加しても コンパイルが通りません。 どうすれば画面に文字列を表示するんですか? あとテキストフィールドを追加するさいに、座標していとかして追加できないんですか?

  • ダブルバッファリング

    ダブルバッファリングを使ったつもりですが、キー操作するたびに画面がチカチカします。 特に <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
  • JFrameクラスの挙動に対する推察と質問

    JFrameクラスの挙動に対する推察と質問 現在、プログラムでJFrameクラスを使って,Windowを表示させるアプリをつくっているのですが、repaintがうまく動作しません。 コードで説明させていただきますと、 public class Main{   public static void main(String[] args){     Drow drow ;     drow = new Drow();     drow.createFrame();     drow.repaint();//画面は更新されない   } } public class Drow extends JPanel{   JFrame frame;   static Image jpg;   static int x;   static int y;   public void createFrame()    {     frame = new JFrame();     Drow app = new Drow();     frame.getContentPane().add(app);     frame.getContentPane().add( new Drow() );     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     frame.setBounds(10, 10, 300, 200);     frame.setTitle("タイトル");     frame.setVisible(true);   }   public void paintComponent(Graphics g){     super.paintComponent(g);     g.drawOval(x, y, 80, 80);   } } このソースのMain文でrepaintを実行させているのですが、画面は更新されません。 このエラーについて自分なりに原因を推察した所、JFrameは自分で自分のクラスのインスタンスを作成しているからではないかと考えました。 なので私がrepaintを実行しても、それは私の作ったdrowインスタンスのpaintComponentが実行されているだけで、JFrameが自動でつくったインスタンスの方には影響がないのだと推察しました。 ここで質問なのですが、私の推察はあっているでしょうか? また、このようなrepaintをMain文で実行したい場合はどのようにしたらよいのでしょうか? お返事お待ちしております。

    • ベストアンサー
    • Java
  • ベクター図のボタンを作りたい

    javax.swing.JButtonでボタンを作って、そこにベクター図を埋め込みたいです。ドーすれば良いですか?サンプルプログラムを書いてくださったり、参考になりそうなホームページを紹介してくださると幸いです。 ボタンに文字(text)を埋め込む方法なら知ってます。ビットマップ図(.pngファイルなど)のアイコンを埋め込む方法も知ってます(ググればサンプルコードが沢山ヒットします)。しかし、ベクトルグラフィックスを埋め込むとなると、ハイレベルでしょうか? javax.swing.JButton maru=new JButton();//ボタンのインスタンス生成 void paint(java.awt.Graphics g){g.fillOval(100,100,100,100);}//位置のxyも短径長径も100ピクセルの楕円黒丸 maruボタンにsetText("●");とするのは簡単なのですが、やりたい事と少し違います。"●"は文字ですし、これだと半径の設定が厳しいです(フォントサイズを変えれば良いのでしょうが)。 やりたい事は、 maru.setIcon(java.awt.Graphics g.fillOval(100,100,100,100));//半径100ピクセルの円をjava.awtで描いて、それをボタンに埋め込みたい  ↑ このコードはエラーになるんです。悲しいです。何とかして、エラーを回避して、maruボタンにfillOval(100,100,100,100)を埋め込みたいです。 ボタンに埋め込む図がベクター図なら、java.awt.Graphics以外の方法でも良いです。だけど、JavaのJButtonを使いますし、javaでベクトルグラフィックスの絵を描くとなるとjava.awt.Graphicsを使うでしょうし、 maru.setIcon(java.awt.Graphics g.fillOval(100,100,100,100));みたいなプログラムが自然かなって思いました。 ***** (以下参考)試しにちょっと作ってみました。 class VectorButtonShitsumon extends java.awt.Frame{ public VectorButtonShitsumon(){setSize(500,500);setVisible(true);} public void paint(java.awt.Graphics g){g.fillOval(100,100,100,100);} public static void main(String[] args){ javax.swing.JFrame fr=new javax.swing.JFrame(); fr.setBounds(200,200,200,200); javax.swing.JButton maru=new javax.swing.JButton(); //maru.setIcon(java.awt.Graphics g.fillOval(100,100,100,100));//←エラーコード maru.setText("●");//setTextは嫌! fr.getContentPane().add(maru,java.awt.BorderLayout.CENTER); new VectorButtonShitsumon(); fr.setVisible(true); }//end main }//end class VectorButtonShitsumon ここまで コメントを外したときのエラーメッセージ Exception in thread "main" java.lang.Error: Unresolved compilation problems: 型 AbstractButton のメソッド setIcon(Icon) は引数 (void) に適用できません 型 Graphics の非 static メソッド fillOval(int, int, int, int) を static 参照することはできません トークン "g" に構文エラーがあります。このトークンを削除してください

    • ベストアンサー
    • Java
  • 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)); } } } }

    • ベストアンサー
    • Java