• 締切済み

Java/描画してもリサイズをしないと描画されない

描画をしてもpaintComponent内でないとリサイズ時に消えてしまい安全じゃないことは知っていましたが、今回は逆のことが起きてしまいました。 親JPanelに子JPanelを追加(add(子))して、その後その子JPanelを消して(removeAll())別の子JPanelを追加(add(子))するとrepaint()をしても描画されません。 リサイズをすると描画されるのですが、リサイズをしなくても描画する方法があればご教示ください。 参考までに。 ゲームのタイトル画面を作るためにこの問題にぶつかりました。タイトル画面とゲーム画面を別にしようとしたためです。

  • dossi
  • お礼率40% (11/27)
  • Java
  • 回答数1
  • ありがとう数2

みんなの回答

  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

コンポーネントの再配置を行っているなら、 repaint()メソッドではなく、revalidate()メソッドではないですか?

dossi
質問者

お礼

teketonさん、ご回答ありがとうございます。 試したところ問題なく再描画がされました。コンポーネントの状態の変化を画面に反映させる場合はrepaint()ではだめなんですね。ありがとうございます。

関連するQ&A

  • JPanelの切り替えと再描画

    ContainerにJPanelをaddし、ボタンを押すことで現在addされているJPanelとは違うJPanelを生成し、再描画させようとしているのですが、うまくいかないため、質問致しました。 -- src --- public class Test extends JFrame implements ActionListener {   Container container;   JPanel panel;   JButton btn;      public Test() {     container = getContentPane();     container.setLayout(new BorderLayout());     // ボタン用パネル     JPanel btnp = new JPanel();     btnp.setLayout(new FlowLayout());     container.add(btnp, BorderLayout.NORTH);          btn = new JButton("aaa");     btn.addActionListener(this);     btnp.add(btn);          // 対象のパネル     panel = new JPanel();       (略)panelの設定     container.add(panel, BorderLayout.CENTER);     setVisible(true);     setBounds(50, 50, 300, 300);     setDefaultCloseOperation(EXIT_ON_CLOSE);   }      public void actionPerformed(ActionEvent e) {     if (e.getSource() == btn) {       container.remove(1);       panel = new JPanel();  // 本来はJPanelを継承したクラスをnewしています       container .add(panel);       repaint();       // ※     }   }      public static void main(String args[]) {     Test t = new Test();   } } ※の箇所をcontainer.repaint() にしたり、paintImmediaely() にしたり出来そうな事を色々試したつもりではいるのですが、うまくいきません… ボタン押下後に、ウィンドウの枠をクリックすると描画されるのですが、いまいちよくわかりません… なにか分かる方いらっしゃいましたらご教授願います。

  • Java、jPanelに描画する

    お世話になっています。 Java言語を始め、オブジェクト指向というなれない環境にいます。(今まではBASICを利用) 今回、jPanelなるものを使い、その中に四角形などを描画したいのですが、 うまくいきません。 public void paintComponent(){ Graphics pnl = panel.getGraphics(); pnl.setColor(new Color(0,0,255)); pnl.drawOval(100,100,50,50); } こういう関数を作り、プログラムから呼び出しています。(フレーム作成時には表示しない) おそらくこの辺りがダメだと思うのですが、よくわかりません。 すいませんが、jPanelの使い方を詳しく教えていただけないでしょうか。 ゲームを作る課題なのですが、ここで詰まってしまい進めません。 ご存じの方がいらっしゃいましたら、ご教授ください。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • 描画してもウィンドウをリサイズすると描画が消える

     アプレットで描画してもウィンドウをリサイズすると、描画が消えてしまいます。  これのどこにrepaint()、update()、paint()を入れてやれば良いのでしょうか。    本格的にプログラムの勉強をしようと考えているのですが、大阪、京都付近でjava、cとかを(出来れば個人教授のような 感じで)教えてくれる、スクールをご存知でしたら是非教えて下さい。 ____________________________________________________________ public class Q_Draw_Line extends Applet implements MouseListener , ActionListener { Graphics g; Color col; Button btnyellow; int mode; Button btncircle; Button btndot; public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void init() { g = getGraphics(); btnyellow = new Button("黄"); this.add(btnyellow); btnyellow.addActionListener(this); btncircle = new Button("円"); this.add(btncircle); btncircle.addActionListener(this); btndot = new Button("点"); this.add(btndot); btndot.addActionListener(this); this.addMouseMotionListener ( new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { int x = e.getX(); // X座標取得 int y = e.getY(); // Y座標取得 g.setColor(col); switch(mode) { case 1 : g.drawOval(x-20/2,y-20/2,20,20);break; case 2 : g.fillRect(x,y,5,5);break; } } } ); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand() == "黄") { col = Color.yellow; } if (e.getActionCommand() == "円") { mode = 1; } if (e.getActionCommand() == "点") { mode = 2; } } }

    • ベストアンサー
    • Java
  • パネルを切替ると、リサイズするまで一部が非表示に

    Java初心者です。タイトルが意味不明でしたら申し訳ありません。 住所録の登録・削除等を操作するアプレットを作成しています。 パネルの内容を変更し、再表示しようとしたところ、アプレット画面をリサイズしなければ一部が表示されないという現象が起きて困っています。 モード(登録・削除・変更等)別にパネルを作成し、アプレット全体を覆うようにして表示しています。 例えば DeletePanel…削除対象検索時→ラベル・操作用パネル(テキストエリア・ボタン)         …削除内容確認時→ラベル・操作用パネル(テキストフィールド・ボタン) というようにです。 上記のラベルはsetTextで表示文章のみを変え、操作用パネルはひとつのパネルをモード・機能別に内容だけ変更して使用しています。 そこで、削除対象検索時から削除内容確認時へとDeletePanelの内容を変更するために、一旦DeletePanel.removeAll()し、 再びinit()で別機能用のDeletePanelに再編集しadd(DeletePanel)をするのですが、 どういうわけか操作用パネルがアプレットビューアをリサイズするまで表示してくれません。 しかも、なぜかラベルはきちんと表示してくれます。 操作用パネルには、さらに細かなパネル・ボタンなどをaddしているので、それが原因なんでしょうか・・・。 現在は、切替えてaddした直後に、resize(width,height)を実行して、アプレットをリサイズして無理やり表示させている状態なのですが、気に食わないです。 CardLayoutを使えば簡単にできるようですが、少々理由があり、敢えて使用していません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 画面リサイズ時のちらつきをなくす方法

    MFCです。 ワーカースレッドで取得したDIBを定期的に描画するプログラムを作っています。 DIB描画部の下にはタイトル的な文字列をTextOutしています。 リサイズ時にはDIBのサイズとタイトル文字列表示領域のサイズも変化させる必要があります。 現在、画面をリサイズするとちらつくという問題の対応に悩んでいます。 コンパチDCなどを使ってダブルバッファリングを行うというのはわかっているのですが、 そもそもリサイズ時にちらつくということは、背景が白(デフォルトのブラシ)で塗りつぶされてしまうのが原因だと思っているので、 OnEraseBkgnd()をオーバーライドして、return TRUE するようにしました。 ちらつかなくなったのですが、OnEraseBkgnd()でほかに何もしていないので、リサイズ前のDIBとタイトル文字列が残ってしまって、新たに書き込んだものと重なってしまいます。 OnEraseBkgnd()で背景をいったん塗りつぶせばいいのではないかと思っているのですが、私の考えは正しいでしょうか?

  • 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
  • Swing自作コンポーネントをadd出来るように、

    JTextFieldやJButtonなどを一つにまとめたコンポーネントを自作し、それをadd()出来るようにしたいです。frame.add(自作のクラスのインスタンス)を可能にしたいです。 調べて、paintComponent()を使えば良いということはわかったのですが、Graphicsのインスタンス(?)に線を描いたり、円を描いたりする方法はわかりましたが、JButtonやJTextFieldなどをGraphicsのインスタンス(?)に追加する方法はわからず、paintComponent()を使うやり方はできませんでした。 paintComponent()も使わずに、自分のできる方法で、組んだものを一応載せます。 import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class MyComponentTest{ public static void main(String[] args){ JFrame frame = new JFrame("タイトル"); frame.setSize(400, 300); frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); // 2つのテキストフィールドと一つのボタンを4つ追加する frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.setVisible(true); } } //2つのテキストフィールドと一つのボタンを一つの部品にしたい class TwoTextFieldsAndOneButton{ JTextField textField1 = new JTextField("テキストフィールド1"); JTextField textField2 = new JTextField("テキストフィールド2"); JButton button = new JButton("ボタン"); // こんなメソッドを使わずに、再現したい JPanel getContent(){ JPanel panel = new JPanel(); panel.add(textField1); panel.add(textField2); panel.add(button); return panel; } }

    • ベストアンサー
    • 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
  • リアルタイムで再描画

    こんにちは。 Delphiを初めて1ヶ月の初心者です。 どうか、Windowのリサイズについてご教授ください。 MDIで画像を表示するプログラムを作成しています。 子画面をマウスドラッグでサイズ変更をしているとき、 マウス移動の間、図形連続的に再描画(縦横比を一定)しようとしています。 FormPaint内でClientWidth とClientheightの設定をしてもうまくいきません。 いい方法がありましたらご教授願います。

  • GradientPaint を JPaneに仕組む

    JPaneにGradientPaint を使って書いたグラデーションを表示させたいのですが、 Jlabelのようにaddで追加できず、実装方法が解りません。 アドバイスをいただけないでしょうか? protected void paintComponent(Graphics g) { JPanel panel = new JPanel(); Graphics2D g2 = (Graphics2D)g; GradientPaint gp = new GradientPaint(10,10,Color.ORANGE,60,60,Color.GREEN); g2.setPaint(gp); g2.fillRect(10, 10, 100, 100); JLabel label = new JLabel("Hello World!!"); getContentPane().add(label); Container contentPane = getContentPane(); contentPane.add(panel); }

    • ベストアンサー
    • Java