首頁 >Java >java教程 >如何在 Swing 應用程式中實現有效的後退和前進導航?

如何在 Swing 應用程式中實現有效的後退和前進導航?

Barbara Streisand
Barbara Streisand原創
2024-12-26 15:24:10468瀏覽

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

在Swing 中實現後退/前進按鈕

初始方法

初始方法

初始方法

提供的程式碼利用堆疊管理螢幕導航。然而,它需要完善才能正常運作。問題在於change_display方法的實作。具體來說,在螢幕之間導航時可能會出現無限堆疊循環。單擊“後退”後,當前面板將被推入 previousPanels 堆棧,並在單擊“前進”時從forwardPanels 堆疊中檢索。然而,同一個面板可以重複地被推入兩個堆疊以及從兩個堆疊中彈出。以非線性方式存取螢幕時可能會發生這種情況。

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);
    }
}

使用 CardLayout 的替代方法

為了解決基於堆疊的方法的問題,有一種替代解決方案建議使用CardLayout。 CardLayout 允許在單一容器內有效管理多個面板。每個面板都分配有一個唯一的識別符作為其名稱。在面板之間導航時,可以使用 CardLayout 來使用其名稱作為鍵切換到所需的面板。

這是使用 CardLayout 的實作:在此實作中, CardPanel 類別代表各個螢幕。每個螢幕都有一個唯一的名稱,與其在 CardLayout 中的按鍵相對應。卡片面板利用 CardLayout 並顯示與目前卡片相對應的螢幕。 導覽按鈕(標記為「上一頁」和「下一頁」)位於控制台中。這些按鈕調用動作以在卡片序列中前進或後退。 這種方法提供了更直觀和穩定的導航體驗,消除了與基於堆疊的實作相關的潛在問題。

以上是如何在 Swing 應用程式中實現有效的後退和前進導航?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn