2

CardLayoutはHashMapを使用してそのペア(パネルと関連する文字列識別子)を格納していると思いましたが、CardLayoutクラスを見ると、実際にはVectorを使用していることがわかりました。これが私が理解している方法です。showメソッドが呼び出されると、ベクトルの内容をループして、equalsこれが適切なカードの名前であるかどうかを確認し、そうである場合は、コンテナーのすべてのパネルをループします。現在表示されているカードを見つけるために、それを非表示にしてから、適切なカードを表示します。

さまざまなパネルが多数あるGUIアプリを作成している場合、目的のパネルに切り替えるのは遅いテクニックではないでしょうか。パネルを配列に格納し、手動でadd/removeまたはsetVisibleCardLayoutを使用する代わりに、パネルを表示する独自の方法を使用する方がよいでしょうか。これは、実際には、CardLayoutに到達する前に最初に使用していた方法です。

4

2 に答える 2

3

これが問題になることはありません。通常、コンポーネントを頻繁に切り替えることはありません。その場合、コンポーネントの数が少ない(通常は3〜100?)リストをスキャンすると、発生する必要のあるその他の操作(新しいコンポーネントの描画など)。データ構造の選択は、パフォーマンスの観点からは基本的に無関係です。リンクリストを使用しても、誰も気付かないでしょう。

また、 HashMapはCardLayoutには適切ではないことに注意してください。これは、//などを使用できるようにカードの順序を保持する必要があるためです。firstnextprevious

したがって、基本的に、心配しないで、独自のCardLayoutクローンを作成する時間を無駄にしないでください。CardLayoutは問題なく機能します。

于 2012-09-27T00:35:52.230 に答える
1

CardLayoutにパフォーマンスの問題は見つかりません。1000個の子コンポーネントがある場合でも、非常に高速に感じられます。previous / nextを使用するか、showを使用することで、非常に高速になります。

問題を再現するSSCCEを投稿してみてください。そうすれば、私たちがお手伝いします。出発点は次のとおりです。

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();
            }
        });
    }
}
于 2012-09-26T22:54:10.623 に答える