![](/img/trans.png)
[英]How to change 'card' in Jframe cardlayout from Jpanel which belonging to card and its placed in another class?
[英]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.