当前位置: 首页 > 知识库问答 >
问题:

如何从卡片上的按钮切换卡片?

唐星晖
2023-03-14

我一直在寻找一个解决办法,现在,尽管所有类似的问题和答案,但没有找到任何似乎工作。我想让用户能够通过卡片布局中设置的各种面板进行操作。然而,我希望用来在这些卡片之间切换的按钮在卡片本身,而不是一组单独的按钮,它不会在程序中改变。下面是创建框架的主文件:

public class BattleGraphs_V1 
{
    JPanel cards;

    public int cardNumber = 1;

    public void addComponentToPane (Container pane)
    {
        JPanel MainMenuCard = new MainMenu_V1();
        JPanel DifficultySelectorCard = new DifficultySelector_V1();

        cards = new JPanel(new CardLayout());

        cards.add(MainMenuCard);
        cards.add(DifficultySelectorCard);

        pane.add(cards, BorderLayout.CENTER);
    }

    private static void createAndShowGUI() 
    {
        JFrame frame = new JFrame("BattleGraphs");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        frame.setPreferredSize(new java.awt.Dimension(725, 420));
        frame.setResizable(false);

        BattleGraphs_V1 containerPanel = new BattleGraphs_V1();
        containerPanel.addComponentToPane(frame.getContentPane());

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) 
    {
        javax.swing.SwingUtilities.invokeLater(new Runnable() 
        {
            public void run() 
            {
                createAndShowGUI();
            }
        });
    }
}

编辑:我向MainMenu JPanel的按钮添加了一个自动生成的操作监听器,如下所示:

private void MainMenuCardSBActionPerformed(java.awt.event.ActionEvent evt) {                                               
        BattleGraphs_V1 BG_V1 = new BattleGraphs_V1();
        CardLayout cardLayout = (CardLayout) (BG_V1.cards.getLayout());
        cardLayout.show(BG_V1.cards, "DifficultyCard");
    }

在主文件(主文件为BattleGraphs_V1)中添加的卡名后,如下所示:

cards.add(MainMenuCard, "MainMenuCard");
cards.add(DifficultySelectorCard, "DifficultyCard");

当我运行该程序并单击按钮时,就会出现空指针异常错误,就像我使用类似的解决方案一样。如果我认为这更多地是一个范围问题,那我会错吗?

第二次编辑:对,希望这会有所帮助,我已经将enite项目添加到GitHubhtml" target="_blank">存储库中了--https://GitHub.com/charga600/battlegraphs/tree/master

共有1个答案

薛滨海
2023-03-14

当你将你的卡片添加到你的面板中时,你应该给它们起名字,这样你就可以选择切换一个你想在某个事件上显示的卡片。

cards = new JPanel(new CardLayout());

cards.add(MainMenuCard, "first");
cards.add(DifficultySelectorCard, "second");

pane.add(cards, BorderLayout.CENTER);

GUI:

JButton button = new JButton("Click here");
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        CardLayout cl = (CardLayout) (cards.getLayout());
        cl.show(cards, "second");
    }
});

编辑

    public class MainMenu_V1 extends JFrame {

    private JMenuBar menuBar;
    private JMenu file;
    private JMenuItem exit;
    private JPanel mainPanel;

    public MainMenu_V1() {
        setTitle("Main Panel");
        setResizable(false);
        setSize(new Dimension(400, 200));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setJMenuBar(createMainMenu());
        setLocationRelativeTo(null);

        mainPanel = new JPanel();
        mainPanel.setLayout(new CardLayout());
        mainPanel.add(new FirstPanel(mainPanel), "FIRST");
        mainPanel.add(new SecondPanel(mainPanel), "SECOND");

        setContentPane(mainPanel);
    }

    public JMenuBar createMainMenu() {
        menuBar = new JMenuBar();
        file = new JMenu("File");
        exit = new JMenuItem("Exit");
        exit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        file.add(exit);
        menuBar.add(file);

        return menuBar;
    }

    public void switchPanel(Container container, String panelName) {
        CardLayout card = (CardLayout) (container.getLayout());
        card.show(container, panelName);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MainMenu_V1().setVisible(true);
            }
        });
    }
}

第一面板

public class FirstPanel extends JPanel {

    private JButton button;
    private JPanel mainPanel;

    public FirstPanel(JPanel mainPanel) {
        this.mainPanel = mainPanel;
        setPreferredSize(new Dimension(400, 200));
        setBackground(Color.GRAY);
        add(createButton());        
    }   

    private JButton createButton() {
        button = new JButton("Switch to the second Panel");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                MainMenu_V1 main = new MainMenu_V1();
                main.switchPanel(mainPanel, "SECOND");                
            }
        });
        return button;
    }
}

第二面板

public class SecondPanel extends JPanel {

    private JButton button;
    private JPanel mainPanel;

    public SecondPanel(JPanel mainPanel) {
        this.mainPanel = mainPanel;
        setPreferredSize(new Dimension(400, 200));
        setBackground(Color.ORANGE);
        add(createButton());
    }   

    private JButton createButton() {
        button = new JButton("Switch to the first Panel");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                MainMenu_V1 main = new MainMenu_V1();
                main.switchPanel(mainPanel, "FIRST");                
            }
        });
        return button;
    }
}
 类似资料:
  • 我正在制作看板,我有一列在里面,它用一个网格窗格划分在标题和下面的卡片列表之间。我正在使用场景生成器构建此场景。 所以层次结构是 当我按下卡上的按钮时,我希望它移除我单击的卡。 我已经做了以下工作 然而,当我按下按钮时什么也没有发生,卡没有被删除,我也不知道为什么。如果有人能帮我,那就太好了。

  • CSS :hover 实现 Tab 切换选项卡 这里我们主要使用:hover伪类选择器 与 ~ 兄弟选择器 与 nth-of-type 选择器实现 Tab 选项卡。 能实现的功能不多,假如能满足需要,使用这个方法是最简单的。 准备一下 HTML <div class="tab"> <span class="top one">1</span> <div cla

  • 我正在尝试使用Jcombobox“费用”在卡片面板之间进行更改。有人能告诉我我做错了什么吗?我使面板正确地出现,但当我看到费用j选项卡式窗格时,第一张卡就显示出来了。一旦我试图在它们之间切换,控制台就会充满错误。我注意到所有的卡片都在同时显示,但它们是重叠的。1)如何一次只显示一张牌(面板)?2)如何让JComboBox在牌(面板)之间切换?

  • 问题内容: 我想使用CSS在html中创建一个切换按钮。我想要它,以便当您单击它时,它保持推入状态,而不是再次单击时它弹出。 如果没有办法仅使用CSS。有没有办法使用jQuery? 问题答案: 良好的语义方式是使用复选框,然后如果未选中,则以不同的方式设置其样式。但是没有好的方法可以做到这一点。您必须添加额外的跨度,额外的div,并且要真正看起来不错,请添加一些javascript。 因此最好的解

  • 我在开发一个Android应用程序。我有一个处于选项卡导航模式的actionbar和三个调用frameview容器中要替换的片段的选项卡。 我的问题是:如果用户在一个选项卡中生成一个backstack,然后切换到另一个选项卡,如果在这种状态下按下back按钮--那么backstack会弹出,但选项卡没有改变,这导致重叠的片段(属于Tab1的backstack片段会弹出/添加,但Tab2仍然被选中,