2017-02-25 21 views
-1

この問題について多くの回答を読んだが、単純なコードでもエラーを見つけることができない。問題は次のとおりです。JPanelにあるJLabelにImageを描画したいのですが、JLabelのpaintComponent()メソッドは呼び出されません。描画イメージのJava repaint()はpaintComponent()を呼び出さない

ImagePainterクラスはイメージここ

public class ImagePainter extends JLabel{ 
    private Image image; 

    public ImagePainter(){ 
     try { 
      image = ImageIO.read(new File("src/testgui/image.png")); 
     } catch (IOException exception) { 
      exception.printStackTrace(); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.drawImage(image, 0, 0, null); 
     System.out.println("in paintComponent"); 
    } 
} 

が標準JFrameのあるを描画する:ここ

コードです。私はcontentPaneにJPanelを追加するように気をつけた。

public class Display extends JFrame{ 

    public Display(){ 
     JPanel jp = new JPanel(); 
     ImagePainter i = new ImagePainter(); 

     getContentPane().add(jp); 
     jp.add(i); 
     jp.repaint(); 

     setSize(800, 800); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    } 
} 

最後にメイン。

public class Main { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable(){ 
      @Override 
      public void run(){ 
       Display d = new Display(); 
      } 
     }); 
    } 

} 

最後に、私は私が直接contentPaneにImagePainterを追加した場合、画像が正しく描画されていることが観察:誰もがやって言うように私はEDTの表示をインスタンス化します。おそらく愚かなエラーですが、文字通り数時間かけて見つけようとしていて、本当に見えません。前もって感謝します !

+0

1)すぐに役立つようにするには、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 ( 'main'メソッドを' Display'クラスに入れて2つのクラスだけにしてから 'ImagePainter'を' public'から降格させ、デフォルトのアクセスにして最後に貼り付けます)2) )は[このQ&A](http://stackoverflow.com/q/19209650/418556)に表示されている画像にホットリンクすることです。 –

答えて

2

画像がカスタム塗装されている場合、ラベルは画像の推奨サイズを考慮していません!デフォルトでパネルにはフローレイアウトがあります。フローレイアウトでは、コンポーネントがフィットするようにストレッチされません。したがって、ラベルのサイズは0 x 0ピクセルになります。ラベルに目に見える境界線を追加することで確認できます。

しかし、イメージがラベルに表示されている場合、イメージをラベルのアイコンとして設定するだけではどうですか。

+0

ありがとうございました!だから私はレイアウトマネージャを変更する必要があり、どのようなレイアウトマネージャが動作するのですか? – Alsvartr

+0

まず、コードがカスタムペイントである理由を理解したいと思います。それはなぜですか? –

+0

BTW - パネルの別のレイアウトを設定することは、ラベルをカスタムペイントすることが理にかなっていても、修正する最良の方法ではありません。 –

0

また、表示コンストラクタ内のステートメントは、フレームをまだ表示していないので役に立たない。

関連する問題