有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在一个类中使用JButton更改另一个类中的卡片(使用CardLayout)

我构建了一个GUI,在其中我使用不同的类扩展面板将几个JPanel组件相互嵌套。在我的Menue中,我有一个CenterPanel和一个ButtonPanelButtonPanel包含实现ActionListener接口的按钮。CenterPanel使用CardLayout,我想使用上述按钮来更改CenterPanel中的卡。问题是,按钮对CenterPanel或面板中的卡一无所知

我不想把所有的东西都放在一节课上,但是我不知道如果不在一节课上写下所有的东西,怎么解决这个问题

以下是我的一些代码:

MenuePanel

public class MenuePanel extends JPanel{

JButton startButton;
JButton exitButton;
JButton anleitungButton;
ButtonPanel buttonPanel;
TitlePanel titlePanel;
JPanel centerPanel;
CardLayout cardLayout;
TextPanel anleitungPanel;
TextPanel gameOverPanel;
TextPanel gameWonPanel;
TextPanel nextLevelPanel;
StartPanel startPanel;

public MenuePanel() {
    super();
    cardLayout = new CardLayout();
    setBackground(Color.CYAN);
    setBounds(0,0,800,600);
    setLayout(new BorderLayout());

    titlePanel = new TitlePanel();
    add(titlePanel, BorderLayout.PAGE_START);

    startPanel = new StartPanel();
    gameOverPanel = new TextPanel("Game Over!");
    gameWonPanel = new TextPanel("Game Won!");
    anleitungPanel = new TextPanel();
    nextLevelPanel = new TextPanel("Next Level!");
    centerPanel = new JPanel();

    centerPanel.setLayout(cardLayout);
    add(centerPanel, BorderLayout.CENTER);
    centerPanel.add(startPanel, "1");
    centerPanel.add(gameOverPanel, "2");
    centerPanel.add(gameWonPanel, "3");
    centerPanel.add(anleitungPanel, "4");
    centerPanel.add(nextLevelPanel, "5");
    cardLayout.show(centerPanel, "2");

    buttonPanel = new ButtonPanel();
    add(buttonPanel, BorderLayout.PAGE_END);
    setVisible(true);
}

ButtonPanel

public class ButtonPanel extends JPanel{

JButton startButton;
JButton exitButton;
JButton anleitungButton;

public ButtonPanel() {
    super();
    setLayout(new FlowLayout());
    setPreferredSize(new Dimension(800, 100));
    setBackground(Color.CYAN);

    startButton = new JButton("start)");
    startButton.setPreferredSize(new Dimension(150,50));
    add(startButton);
    anleitungButton = new JButton("anleitung");
    anleitungButton.setPreferredSize(new Dimension(150,50));
    add(anleitungButton);
    exitButton = new JButton("exit");
    exitButton.setPreferredSize(new Dimension(150,50));
    add(exitButton);

    CloseListener closeListener = new CloseListener();
    StartListener startListener = new StartListener();
    AnleitungListener anleitungListener = new AnleitungListener();
    startButton.addActionListener(startListener);
    anleitungButton.addActionListener(anleitungListener);
    exitButton.addActionListener(closeListener);

}

TextPanel

public class TextPanel extends JPanel{
JLabel text;

public TextPanel(String panel) {
    super();
    text = new JLabel(panel, SwingConstants.CENTER);
    setPreferredSize(new Dimension(800, 400));
    text.setFont(new Font("Arial", Font.ITALIC, 75));
    add(text);
}

AnleitungListener

public class AnleitungListener implements ActionListener{

@Override
public void actionPerformed(ActionEvent e) {

}

我是不是做错了,需要改变整个架构?如果,怎么做?关于如何使用ActionListeners的大多数示例要么是在一个类中编写的,要么是以复杂的方式让我理解


共 (1) 个答案

  1. # 1 楼答案

    您可以在两者之间创建一个类来协调整个切换,以防止在类之间共享大量实例。我已经创建了一个使用CardSwitcher的例子,它可以做到这一点

    如果你觉得有用,请告诉我

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class Test extends JPanel {
    
        public static void main(String[] args) {
            JFrame frame = new JFrame("Test");
    
            Test tst = new Test();
            frame.getContentPane().add(tst);
    
            frame.setSize(600, 600);
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.setVisible(true);
    
        }
    
        public Test() {
            setLayout(new BorderLayout());
            CardLayout cardLayout = new CardLayout();
    
            JPanel centerPanel = new JPanel(cardLayout);
    
            JPanel panelA = new JPanel();
            panelA.add(new JLabel("Panel A"));
            centerPanel.add(panelA, "A");
            JPanel panelB = new JPanel();
            panelB.add(new JLabel("Panel B"));
            centerPanel.add(panelB, "B");
            JPanel panelC = new JPanel();
            panelC.add(new JLabel("Panel C"));
            centerPanel.add(panelC, "C");
    
            CardSwitcher switcher = new CardSwitcher(centerPanel, cardLayout);
            ButtonPanel buttons = new ButtonPanel(switcher);
    
            add(centerPanel, BorderLayout.CENTER);
            add(buttons, BorderLayout.SOUTH);
    
    
        }
    
        class ButtonPanel extends JPanel {
            public ButtonPanel(CardSwitcher switcher) {
                setLayout(new FlowLayout());
    
                JButton buttonA = new JButton("Show A");
                buttonA.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        switcher.switchTo("A");
                    }
                });
                add(buttonA);
    
                JButton buttonB = new JButton("Show B");
                buttonB.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        switcher.switchTo("B");
                    }
                });
                add(buttonB);
    
                JButton buttonC = new JButton("Show C");
                buttonC.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        switcher.switchTo("C");
                    }
                });
                add(buttonC);
    
            }
        }
    
    
        class CardSwitcher {
            CardLayout layout;
            Container container;
    
            public CardSwitcher(Container container, CardLayout layout) {
                this.layout = layout;
                this.container = container;
            }
    
            public void switchTo(String card) {
                layout.show(container, card);
            }
        }
    }