我的gui在运行时占用了太多资源

时间:2017-07-22 09:13:33

标签: java swing paintcomponent

我有一个包含单个面板的JFrame。 在面板中,我使用paintComponent方法根据Jframe的大小调整其元素的大小。 JPanel的元素是一个图像作为背景和4 JLabel,它结合了4个ImageIcon并像按钮一样工作。 Jpanel的paintComponent方法如下所示

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)所以我没有在这里写。 当我运行应用程序时,它需要大约300 MB的RAM和大约30%的CPU(Inter core i5-6200U),这对我来说非常不合适,特别是CPU的数量。是什么导致我的应用程序占用了这么多资源,有什么方法可以减少它吗?

1 个答案:

答案 0 :(得分:5)

每当您重新绘制组件时,都会更改标签'维度和创建资源(Image和从中派生的ImageIcon)并将它们指定为新图标。这些是对应用程序可见部分的更改,因此必须重新绘制相关组件。基本上你的paintComponent方法

  1. 每次有效地调用时都会重新创建一个无限循环和
  2. 非常重量级,因为它分配了昂贵的资源。
  3. 这两点都是非常糟糕的想法。您的paintComponent方法应该按照名称的建议,即绘制组件。所有导致重绘的操作(更改图标或文本,在树中添加或删除组件等)都不得在其中发生。

    另见:

    The API documentation on paintComponent(Graphics)

    Painting in AWT and Swing

    编辑:如果要根据其他组件的大小调整组件大小,请创建ComponentListener并通过调用addComponentListener(ComponentListener)将其添加到要依赖的组件。然后,只要大小发生变化,ComponentListener实例就会调用它的componentResized(ComponentEvent)方法。