
[code]

    public class BI2DPv extends javax.swing.JPanel{
        BufferedImage bi;//コレに描画してからg2に転写
        @Override
        public void paintComponent(Graphics g){
            //super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g;
            logger.log(Level.INFO,"Entered in paintComponent");
            //paintComponent（repaint）はbiをg2に転写するだけ。
            if(bi != null)g2.drawImage(bi, null, this);
        }
        //biは別メソッドで生成してあります。
    }
    
[/code]

`JPanel`を継承したJava2D描画用のクラスを用意しました。メインのクラスの方で`BI2DPv`のインスタンスを生成し、`bi2dpv.repaint();`を実行しても`paintComponent`が実行されません。`bi2dpv.repaint();`が呼ばれていることはログで確認してあります。`repaint`を指示しても`paintComponent`が実行されないのはなぜでしょうか。


CC BY-SA 3.0
2016-01-16T02:15:29.097
20962
2016-10-17T04:52:46.277
2016-01-16T22:18:59.113
46
14029
question
java swing
repaintしてもpaintComponentが呼ばれない。


`BI2DPv#repaint()`がどう呼ばれているのかが分からないので推測ですが、その`JPanel`が`JFrame`、または`JApplet`などのトップレベルコンテナに追加されていないのではないでしょうか。

参考: [Top-Level Containers and Containment Hierarchies (The Java™ Tutorials >
Creating a GUI With JFC/Swing > Using Swing
Components)](https://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html)

例えば、以下のサンプルコードでは、一秒ごとに`bi2dpv.repaint();`を実行していますが、`return
bi2dpv;`をコメントアウトして、`return new
JPanel();`を実行し、`JFrame`に`bi2dpv`を追加しないようにした場合、`bi2dpv`は非表示なので`bi2dpv#repaint()`メソッドを呼んでも`bi2dpv#paintComponent(...)`メソッドは実行されません。

* * *

**サンプルコード編集** : `JTabbedPane`に`bi2dpv`を追加するよう変更

[code]

    import java.awt.*;
    import java.awt.image.*;
    import javax.swing.*;
    
    public class BI2DPv extends JPanel {
      BufferedImage bi;//コレに描画してからg2に転写
      @Override
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        //logger.log(Level.INFO,"Entered in paintComponent");
        System.out.println("paintComponent");
        //paintComponent（repaint）はbiをg2に転写するだけ。
        if (bi != null) {
          g2.drawImage(bi, null, this);
        }
      }
      //biは別メソッドで生成してあります。
    
      private static JComponent makeUI() {
        JPanel bi2dpv = new BI2DPv();
        new Timer(1000, e -> {
          System.out.println("\nbi2dpv.repaint()");
          System.out.println("isDisplayable? " + bi2dpv.isDisplayable());
          System.out.println("isShowing? " + bi2dpv.isShowing());
          System.out.println("isVisible? " + bi2dpv.isVisible());
          bi2dpv.repaint();
        }).start();
    
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.addTab("aaa", new JPanel());
        tabbedPane.addTab("bbb", bi2dpv);
        return tabbedPane;
        //return new JPanel();
      }
      public static void main(String... args) {
        EventQueue.invokeLater(() -> {
          JFrame f = new JFrame();
          f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
          f.getContentPane().add(makeUI());
          f.setSize(320, 240);
          f.setLocationRelativeTo(null);
          f.setVisible(true);
        });
      }
    }
    
[/code]


CC BY-SA 3.0
2016-01-16T17:47:15.140
20985
2016-01-17T15:09:11.563
2016-01-17T15:09:11.563
46
46
20962
answer