Java添加背景后,为什么程序会变慢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java添加背景后,为什么程序会变慢?相关的知识,希望对你有一定的参考价值。

因此,如果我添加背景图片,那么我多次单击按钮,我的程序将越来越慢。但是,如果我不添加该背景图片,它将不会变慢。谁能告诉我为什么?谢谢!这是我的JFrame类:

public class test extends JFrame implements ActionListener 
    private Container contentPane;

    public test() throws FileNotFoundException 
        // set the position of the GUI related with screen size
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        double width = screenSize.getWidth();
        double height = screenSize.getHeight();
        this.setBounds((int) width / 4, (int) height / 4, (int) width / 2, (int) height / 2);

        //set background
        ImageIcon img = new ImageIcon("background.jpeg");

        // get the container
        contentPane = this.getContentPane();
        //contentPane.setLayout(new GridLayout(3, 1));

        /*
         *background panel
         */
        JPanel backgroundPanel = new JPanel()
            
                this.setOpaque(false);
            
            public void paintComponent(Graphics g) 
                img.setImage(img.getImage().getScaledInstance(this.getWidth(), this.getHeight(), Image.SCALE_AREA_AVERAGING));
                g.drawImage(img.getImage(), 0, 0, this);
                super.paintComponent(g);

            
        ;
        contentPane.add(backgroundPanel);
        backgroundPanel.setLayout(new GridLayout(3, 1));


        /*
         * second area
         */
        JPanel secondPanel = new JPanel();
        secondPanel.setOpaque(false);
        // display button
        makeButton(secondPanel, "Display", this);
        backgroundPanel.add(secondPanel);
    

    private void makeButton(JPanel p, String name, ActionListener target) 
        JButton b = new JButton(name);
        b.setFont(new Font(null, Font.PLAIN, 20));
        // add it to the specified JPanel and button group and make the JPanel listen
        p.add(b);
        b.addActionListener(target);
    

    @Override
    public void actionPerformed(ActionEvent e) 
        // TODO Auto-generated method stub
        String command = e.getActionCommand();
        // Load button
        // Display button
        if (command.equals("Display")) 
            // check is there any document has been loaded
                // pop-up window
            JOptionPane.showMessageDialog(null, "Please load a document first!", "Error",JOptionPane.PLAIN_MESSAGE);
        
        // show states button
    
 

这里是主要方法:

public class DocumentViewer 

    public static void main(String[] args) throws IOException 
        // TODO Auto-generated method stub
        JFrame frm = new test();
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.setVisible(true);
    


请帮助!

为什么stackoverflow总是告诉我'看起来您的帖子主要是代码,请添加更多详细信息',此功能不够智能。我认为这很清楚!

答案

这里:

public void paintComponent(Graphics g) 
    img.setImage(img.getImage().getScaledInstance(this.getWidth(), this.getHeight(), Image.SCALE_AREA_AVERAGING));
    g.drawImage(img.getImage(), 0, 0, this);
    super.paintComponent(g);

您正在执行资源消耗大的计算在绘画方法内,这种方法对用户感知的程序响应能力有很大贡献。不要这样缩放图像once,并将其存储在变量中。

以上是关于Java添加背景后,为什么程序会变慢?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们的 React Native 应用在 Android 手机上使用时会变慢?

为什么在循环访问DataTable列时第二种方法会变慢

为啥 Android Studio 在编辑 xml 文件或更改设计时会变慢?

为啥codeigniter会变慢?

当我使用较小的浮点数时,为啥 sklearn 中的 KNN 实现会变慢?

为啥在视图中使用此查询会变慢?