2017-07-22 5 views
1

私は1つのパネルを含むJFrameを持っています。 パネルでは、paintComponentメソッドを使用して、Jframeのサイズに従って要素のサイズを変更します。 JPanelの要素は、背景としてのイメージと、4つのImageIconとボタンのように機能する4つのJLabelです。私のguiが実行時に多すぎるリソースを取っています

public class MyPanel extends JPanel 
{ 
    //Declarations 
    private BufferedImage backGround; 
    public MyPanel() 
    { 
     //Some code here 
    } 

    public void paintComponent(Graphics graphics) 
    { 
     super.paintComponent(graphics); 
     Graphics2D graphics2d = (Graphics2D) graphics; 

     if(backGround != null) 
     { 
      graphics2d.drawImage(backGround, 0, 0, getWidth(), getHeight(), this); 
     } 

     /* This code is repeated 4 times because I have 4 labels */ 
     label1.setSize(getWidth()/7 , getHeight()/10); 
     label1.setLocation(getWidth()/2 - getWidth()/14 , getHeight()/3); 
     image1 = button1.getScaledInstance(label1.getWidth(), label1.getHeight(), 
       Image.SCALE_SMOOTH); 
     label1.setIcon(new ImageIcon(image1)); 
    } 
} 

の下枠はので、私はそれをここに書いていないだけの簡単な方法を持っている、(myPanel)を追加するようにJPanelの方法paintComponentです。 私はアプリケーションを実行すると、それは私にとってはまったく当たり前のCPUの量(特にInter Core i5-6200U)の約30%のRAMと約300 MBのRAMを必要とします。何が私のアプリケーションに非常に多くのリソースを必要としているのですか?それを減らす方法はありますか?

+0

backGroundとは何ですか?どこでも宣言されていない – Maaaatt

+0

私は宣言の部分をコメントしました。それは質問のポイントではありません –

+0

'label1'、' 'image1'、' button1'は何ですか? JPanelとの関係はどうですか? 'paintComponent'は' painting'の必要性があるたびに呼び出され、それぞれの絵にリソースを再作成していることを思い出してください。リサイズイベントをキャプチャし、そのような場合にのみリソースを作成することを推奨します。 –

答えて

4

コンポーネントを再描画するたびに、ラベルのディメンションを変更し、リソース(イメージとそこから派生したImageIcon)を作成し、それらを新しいアイコンとして割り当てます。これらはアプリケーションの可視部分の変更であり、問​​題のコンポーネントを再描画する必要があります。基本的には自分のpaintComponentメソッド

  1. は、それが効果的に無限ループと
  2. を作成する呼び出されるたびに再描画を引き起こし、それが高価なリソースを割り当てているため非常にヘビー級です。

これらの両方の点はかなり悪い考えです。あなたのpaintComponentメソッドは、名前が示唆するものだけで、つまりコンポーネントをペイントする必要があります。再ペイントを引き起こすすべてのアクション(アイコンやテキストの変更、ツリーからのコンポーネントの追加や削除など)は発生してはなりません。

も参照してください:

The API documentation on paintComponent(Graphics)

Painting in AWT and Swing

EDITを:あなたは他のコンポーネントの大きさに依存コンポーネントのサイズを変更したい場合はComponentListenerを作成し、あなたが依存するコンポーネントに追加しますaddComponentListener(ComponentListener)を呼び出してください。 ComponentListenerインスタンスは、サイズが変更されたときに呼び出されるcomponentResized(ComponentEvent)メソッドを呼び出します。

+0

私はその部分を理解していますが、問題は、私がpaintComponentメソッドにそれらを入れないならフレームのサイズ –

+0

Zurmaa、あなたの解決策は良かった、私は今、それを試しました、ありがとう:) –

関連する問題