首页 > Java > java教程 > 如何在 Swing 应用程序中实现有效的后退和前进导航?

如何在 Swing 应用程序中实现有效的后退和前进导航?

Barbara Streisand
发布: 2024-12-26 15:24:10
原创
473 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板