首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CardLayout性能?

CardLayout性能?
EN

Stack Overflow用户
提问于 2012-09-26 21:42:23
回答 2查看 596关注 0票数 2

我认为CardLayout使用一个HashMap来存储它的对(面板和相关的字符串标识符),但是纵观CardLayout类,我注意到它实际上使用了一个向量。这就是我所理解的:当调用show方法时,它循环遍历向量的内容,用equals检查它是否是适当卡的名称,如果是的话,它会循环遍历容器的所有面板,找出当前可见的面板,然后隐藏它,然后显示适当的卡。

如果我正在制作一个gui应用程序,它有很多不同的面板,这难道不是一种缓慢的技术,可以切换到想要的面板吗?我是否应该使用自己的方式来显示面板,比如将它们存储到数组中,并手动使用add/removesetVisible,而不是使用CardLayout?这实际上是我在进入CardLayout之前使用的方式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-27 00:35:52

这将不会成为的问题,:您通常不会频繁地在组件之间切换,并且当您使用少量的组件扫描列表时(通常是3-100?)与其他必须进行的操作(例如绘制新组件)相比,所花费的时间微不足道。从性能的角度来看,数据结构的选择基本上是无关紧要的--您可以使用链接列表,而没有人会注意到。

还要注意的是,对于一个first/next/previousHashMap是不合适的,因为它需要保持卡片的顺序,以便您可以使用CardLayout等等。

因此,基本上,不要担心,也不要浪费时间滚动您自己的CardLayout克隆- CardLayout工作得很好。

票数 3
EN

Stack Overflow用户

发布于 2012-09-26 22:54:10

我在CardLayout中没有发现任何性能问题。即使您有1000个子组件,它仍然感觉非常快。无论是使用上一次/下一次,还是使用show,它都进行得非常快。

尝试发布一个SSCCE来重现您的问题,然后我们可能会帮助您。以下是从以下几个方面开始的:

代码语言:javascript
复制
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestCardLayout {

    protected void initUI() {
        JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final CardLayout layout = new CardLayout();
        final JPanel panel = new JPanel(layout);
        for (int i = 0; i < 1000; i++) {
            panel.add(new JLabel("Label " + i), getLabelConstraint(i));
        }
        JButton next = new JButton("Next");
        next.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                layout.next(panel);
            }
        });
        JButton previous = new JButton("Previous");
        previous.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                layout.previous(panel);
            }
        });
        final JButton choose = new JButton("Choose");
        choose.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String value = JOptionPane.showInputDialog(choose, "Enter a number between 0 and 999");
                try {
                    int i = Integer.valueOf(value);
                    if (i > -1 && i < 1000) {
                        layout.show(panel, getLabelConstraint(i));
                    }
                } catch (NumberFormatException e1) {
                    e1.printStackTrace();
                }
            }
        });
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(previous);
        buttonPanel.add(next);
        buttonPanel.add(choose);

        frame.add(buttonPanel, BorderLayout.SOUTH);
        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private String getLabelConstraint(int i) {
        return "ComponentConstraint" + i;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestCardLayout().initUI();
            }
        });
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12610911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档