2016-11-18 11 views
0

このコードを実行するとPaintComponentは呼び出されません。「塗装された」メッセージは決して印刷されず、理由はわかりません。誰も助けることができますか?JPanelでPaintComponentが呼び出されていない

public class DisplayManager extends JPanel { 

public static final int WIDTH = 700, HEIGHT = 900; 

public Bottle bottle1 = new Bottle("res/bottleimage.png"); 
public Slider slider1 = new Slider(); 

public void initDisplay() 
{ 
    JFrame frame = new JFrame(); 
    JPanel panel = new JPanel(); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(new Dimension(WIDTH, HEIGHT)); 

    frame.add(panel); 

    frame.setVisible(true); 
} 

@Override 
public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    bottle1.imageIcon.paintIcon(this, g, 50, 50); 
    System.out.println("painted"); 
} 
} 
+1

'DisplayManager'が' JPanel'になっている場合は、新しい 'JPanel'ではなく' Frame'に 'DisplayManager'を追加する必要があります。 'frame.add(this)'の代わりに 'frame.add(panel)' –

+0

がありました。これは – PDPIG

+0

@PDPIGでした。これは解決策の半分にすぎません。 – camickr

答えて

2

基本的なコードに問題がいくつかあります:既にあなたがフレームやパネルにあなたのDisplayManagerクラスのインスタンスを追加する必要が述べたように

  1. が。

  2. カスタムペイントを行うときは、コンポーネントのgetPreferredSize()メソッドをオーバーライドして、必要なサイズを返す必要があります。現在、コンポーネントの推奨サイズは(0、0)です。デフォルトのレイアウトマネージャはBorderLayoutであり、デフォルトで、それは、フレーム内のすべての利用可能なスペースを得ることを意味し、レイアウトのCENTERに追加されるため

フレームにDISPLAYMANAGERを追加するための提案にのみ機能します。

しかし、あなたが使用している場合:

frame.add(this, BorderLayout.PAGE_START); 

をあなたはそれが(0、0)の大きさを持つコンポーネントのサイズは表示されません。

関連する問題