我的图形用户界面在 运行 时间内占用了太多资源
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 方法
- 每次调用都会导致重绘,有效地创建了一个无限循环并且
- 非常重量级,因为它分配昂贵的资源。
这两点都是很糟糕的主意。您的 paintComponent 方法应该正如其名称所暗示的那样,即绘制组件。所有导致重绘的操作(更改图标或文本、在树中添加或删除组件等)不得在其中发生。
另请参阅:
The API documentation on paintComponent(Graphics)
编辑:当您想根据其他组件的大小调整组件的大小时,创建一个 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) 方法,只要大小发生变化就会调用。
我有一个包含单个面板的 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 方法
- 每次调用都会导致重绘,有效地创建了一个无限循环并且
- 非常重量级,因为它分配昂贵的资源。
这两点都是很糟糕的主意。您的 paintComponent 方法应该正如其名称所暗示的那样,即绘制组件。所有导致重绘的操作(更改图标或文本、在树中添加或删除组件等)不得在其中发生。
另请参阅:
The API documentation on paintComponent(Graphics)
编辑:当您想根据其他组件的大小调整组件的大小时,创建一个 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) 方法,只要大小发生变化就会调用。