我的图形用户界面在 运行 时间内占用了太多资源

my gui is taking too much resources in run time

我有一个包含单个面板的 JFrame。 在面板中,我使用 paintComponent 方法根据 Jframe 的大小调整其元素的大小。 JPanel 的元素是作为背景的图像和包含 4 个 ImageIcon 并像按钮一样工作的 4 个 JLabel。 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)); 
  }
}

框架只有一个简单的方法,add(myPanel) 所以我没有写在这里。 当我 运行 应用程序时,它占用了我大约 300 MB 的内存和大约 30% 的 CPU (Inter core i5-6200U),这对我来说很不正常,特别是 [=16 的数量=].是什么导致我的应用程序占用如此多的资源,有什么方法可以减少它吗?

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

  1. 每次调用都会导致重绘,有效地创建了一个无限循环并且
  2. 非常重量级,因为它分配昂贵的资源。

这两点都是很糟糕的主意。您的 paintComponent 方法应该正如其名称所暗示的那样,即绘制组件。所有导致重绘的操作(更改图标或文本、在树中添加或删除组件等)不得在其中发生。

另请参阅:

The API documentation on paintComponent(Graphics)

Painting in AWT and Swing

编辑:当您想根据其他组件的大小调整组件的大小时,创建一个 ComponentListener and add it to the component you want to depend on by calling addComponentListener(ComponentListener). The ComponentListener instance will then have its componentResized(ComponentEvent) 方法,只要大小发生变化就会调用。