当前位置: 首页 > 知识库问答 >
问题:

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

柯新翰
2023-03-14

我有一个包含单个面板的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)); 
  }
}

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

共有1个答案

夏侯华彩
2023-03-14

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

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

这两点都是相当糟糕的想法。您的paintComponent方法应该执行名称所建议的操作,即绘制组件。所有导致重新绘制的操作(更改图标或文本,从树中添加或删除组件等)都不得在其中发生。

编辑:当您希望根据其他组件的大小调整组件的大小时,创建一个ComponentListener,并通过调用addComponentListener(ComponentListener)将其添加到您希望依赖的组件中。ComponentListener实例随后将在大小更改时调用其ComponentRized(ComponentEvent)方法。

 类似资料:
  • 此select语句返回4k行。在我的应用程序中占用时间的是while循环。单循环就需要2到4分钟。关于如何优化它有什么想法吗? 不要太担心查询本身,因为它不会在查询响应上花费太多时间。

  • MySQLdump和上传过程花费了太长的时间(~8小时)来完成整个过程。 我正在将活动数据库转储到mysqldump.tar文件和几乎3GB。当我加载到新的数据库,它需要6-8小时来完成这个过程(上传到新的数据库)。 我要完成这个过程,推荐的解决方案是什么?

  • 我正在我的SQL中使用一个查询。首先我用 我该怎么做才能让它快过2秒

  • 我有一个大型的实时数据库,其中大约1000个用户每分钟更新2个或更多的更新。同时,有4个用户正在获取报告和添加新的项目。到目前为止,主表包含大约200万和400万行。 使用这些表的查询花费了太多时间,即使是简单的查询,如: 分别用了10秒和26秒 大报告现在只需15分钟!!!太,太,太多时间了。 我使用的所有桌子都是innodb 在我读到关于名誉的文章之前,有没有什么方法可以解决这个问题?? 事先

  • 任何解决这一问题的建议都将不胜感激。或者我们可以用另一种方式来计数?我想补充一些细节。滑动大小是一个事件和窗口大小超过10小时(每秒大约有300个事件),我们需要对每个事件做出反应。所以在这种情况下,我们没有使用Flink提供的窗口。我们使用来存储前面的信息。在中用于触发旧数据的清理作业。最后dinstinct键的数量非常多。

  • 我正在使用框架用iPhone摄像头捕捉视频,我的代码: 在之前,一切都很顺利,内存被限制在3M,但在之后,内存使用量每秒增加0.06M,几分钟后,应用程序会因为内存警告而崩溃。似乎占用了太多内存,并且可能存在内存泄漏问题。 那么如何减少内存使用量呢? iOS版本:7.1.1