【问题标题】:Navigating between multiple panels在多个面板之间导航
【发布时间】:2012-06-09 17:01:43
【问题描述】:

谁能告诉我如何编码多个JPanel 类之间的导航,从对象(面板)本身获取来自JButton 的事件触发器?我读过CardLayout。面板可以从父面板中发生的事件中交换。我想要实现的是单击面板中嵌入的按钮,它应该消失或应该显示所需的面板。似乎找不到解决办法。

【问题讨论】:

  • “谁能告诉我..” 当然可以,但是what have you tried? 我的意思是除了在互联网上随机询问陌生人给你。
  • 你是对的——CardLayout 可以做到这一点。现在您所要做的就是尝试编写代码并看看会发生什么。 那么如果您遇到困难,请回来向我们展示您的代码,并告诉我们它如何或为什么不起作用。不要试图找到解决方案,而是尝试编写解决方案。你会从努力中学到更多,相信我。

标签: java swing awt jpanel cardlayout


【解决方案1】:

CardLayout 没有任何东西可以防止卡片内的孩子的动作切换卡片。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Testing extends JFrame {

    private JPanel cardHolder;
    private CardLayout cards;
    private static final String cardA = "A";
    private static final String cardB = "B";

    private class Switcher implements ActionListener{
        String card;        
        Switcher(String card) { this.card = card; }
        @Override
        public void actionPerformed(ActionEvent e) {
            cards.show(cardHolder, card);
        }
    }

    private void run() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel pa = new JPanel();
        JButton ba = new JButton("Switch to B");
        ba.addActionListener(new Switcher(cardB));
        pa.add(ba);
        pa.setBackground(Color.CYAN);

        JPanel pb = new JPanel();
        JButton bb = new JButton("Switch to A");
        bb.addActionListener(new Switcher(cardA));
        pb.add(bb);
        pb.setBackground(Color.MAGENTA);

        cardHolder = new JPanel();
        cards = new CardLayout();
        cardHolder.setLayout(cards);
        cardHolder.add(pa, cardA);
        cardHolder.add(pb, cardB);
        add(cardHolder);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                @Override
                public void run() {
                    new testing().run();
                }
            });
        } catch (Exception ex) { }
    }
}

【讨论】:

  • +1 但是 1) 从不 extends JFrame / JDialog / JWindow 2) 正确使用 Java 命名约定,那么类名 testing 应该是 Testing
  • 基因,非常感谢它就像一个魅力。我的错误是尝试使用 panel.setVisible()、revalidate() 和 repaint() 方法来隐藏/显示面板。抱歉,我没有发布我的代码,我觉得它不会做太多。非常感谢。我是 StackOverFlow 的新手,有什么地方可以 +1 解决方案。
  • “有没有我可以为解决方案 +1 的地方。” 除非你有足够的代表。点。接受答案(就像您所做的那样)始终是表示对答案满意的好方法。
  • 谢谢。我总是在我当前的项目中保留一个名为测试的小课程,作为快速实验的地方。我使用全小写的名称来允许我的构建脚本在最终构建中剥离它。
  • 我不确定您所说的 never extends JFrame 是什么意思。 run() 方法扩展了JFrame,我想不出如果不这样做会更清晰的方法。干杯。
【解决方案2】:

您可以使用JMenu with JMenuItems 而不是使用JButton 在卡片之间切换

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多