ホームページ >Java >&#&チュートリアル >Swing アプリケーションに効果的な前後ナビゲーションを実装するにはどうすればよいですか?

Swing アプリケーションに効果的な前後ナビゲーションを実装するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-26 15:24:10470ブラウズ

How to Implement Effective Back and Forward Navigation in a Swing Application?

Swing での戻る/進むボタンの実装

初期アプローチ

提供されたコードはスタックを利用します画面ナビゲーションを管理します。ただし、適切に機能するには改良が必要です。問題は、change_display メソッドの実装にあります。具体的には、画面間を移動するときに無限スタック ループが発生する可能性があります。 「戻る」をクリックすると、現在のパネルがpreviousPanelsスタックにプッシュされ、「進む」をクリックするとforwardPanelsスタックから取得されます。ただし、同じパネルが両方のスタックに繰り返しプッシュおよびポップされる可能性があります。このシナリオは、非線形な方法で画面にアクセスしたときに発生する可能性があります。

CardLayout を使用した代替アプローチ

スタックベースのアプローチの問題に対処するには、代替ソリューションを使用します。 CardLayout を使用することが提案されています。 CardLayout を使用すると、単一のコンテナ内で複数のパネルを効率的に管理できます。各パネルには、その名前として機能する一意の識別子が割り当てられます。パネル間を移動するとき、CardLayout を利用して、その名前をキーとして使用して目的のパネルに切り替えることができます。

CardLayout を使用した実装は次のとおりです。

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.util.Random;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/5654926 */
public class CardPanel extends JPanel {

    private static final Random random = new Random();
    private static final JPanel cards = new JPanel(new CardLayout());
    private final String name;

    public CardPanel(String name) {
        this.name = name;
        this.setPreferredSize(new Dimension(320, 240));
        this.setBackground(new Color(random.nextInt()));
        this.add(new JLabel(name));
    }

    @Override
    public String toString() {
        return name;
    }

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

            @Override
            public void run() {
                create();
            }
        });
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        for (int i = 1; i < 9; i++) {
            CardPanel p = new CardPanel("Panel " + String.valueOf(i));
            cards.add(p, p.toString());
        }
        JPanel control = new JPanel();
        control.add(new JButton(new AbstractAction("\u22b2Prev") {

            @Override
            public void actionPerformed(ActionEvent e) {
                CardLayout cl = (CardLayout) cards.getLayout();
                cl.previous(cards);
            }
        }));
        control.add(new JButton(new AbstractAction("Next\u22b3") {

            @Override
            public void actionPerformed(ActionEvent e) {
                CardLayout cl = (CardLayout) cards.getLayout();
                cl.next(cards);
            }
        }));
        f.add(cards, BorderLayout.CENTER);
        f.add(control, BorderLayout.SOUTH);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

この実装では、 CardPanel クラスは個々の画面を表します。各画面には、CardLayout 内のキーに対応する一意の名前が付いています。カード パネルは CardLayout を利用し、現在のカードに対応する画面を表示します。

ナビゲーション用のボタン (「前へ」と「次へ」というラベルが付いています) はコントロール パネルにあります。これらのボタンは、カード シーケンスを進めるか後退するアクションを呼び出します。

このアプローチにより、より直感的で安定したナビゲーション エクスペリエンスが提供され、スタックベースの実装に関連する潜在的な問題が排除されます。

以上がSwing アプリケーションに効果的な前後ナビゲーションを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。