簡體   English   中英

在一個類中使用JButton更改另一類中的卡(使用CardLayout)

[英]Using JButton in one class to change card in another class (using CardLayout)

我構建了一個GUI,其中使用不同的類擴展面板將幾個JPanel組件彼此嵌套。 在我的Menue我有一個CenterPanel和一個ButtonPanel ButtonPanel包含實現ActionListener接口的按鈕。 CenterPanel使用CardLayout ,我想使用上述按鈕更改CenterPanel的卡。 問題是,這些按鈕對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的大多數示例只是在一個類中編寫,或者使我理解起來很復雜。

您可以在兩者之間創建一個類來協調整個切換,以防止在類之間共享大量實例。 我已經創建了一個使用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);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM