如何在外部类中的ActionListeners中切换CardLayout中的面板

我在主类中有一个cardLayout,通过面板将Gui类添加到布局中,当按下Room1Button时,如何将主方法中的卡切换到Gui2卡

这是最好的方式来解决这个问题,任何帮助都会得到解决

主要方法

import javax.swing.*; import java.awt.*; class Main { CardLayout cl=new CardLayout(); GridBagConstraints gb=new GridBagConstraints(); JFrame frame=new JFrame("Frame"); JPanel panel =new JPanel(); Gui1 g1= Gui1(); Gui2 g2= Gui2(); public Main() { panel.setLayout(cl); panel.add(g1, "1"); panel.add(g2, "2"); frame.add(panel); frame.pack(); frame.setVisible(true); cl.show(panel,"1"); //how would the actionlistner in the Gui1 class switch the layout to "2" cl.show(panel, "2"); } public static void main(String[]param) { new Main(); } } 

gui1class

  import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.*; public class Gui1 extends JPanel implements ActionListener{ private JButton room1Button; JPanel panel=new JPanel(); { setSize(1000,1000); panel.setVisible(true); room1Button=new JButton("Go the next Panel"); this.setVisible(true); room1Button.addActionListener(this); add(room1Button); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==room1Button){ Window w = SwingUtilities.getWindowAncestor(R0.this); w.setVisible(false); } } } 

Gui2class

  public class Gui2 extends JPanel implements Actionlistener { // some code } 

ActionEvent将包含生成事件的源对象。 在这种情况下,JButton。 因此,GUI1类中的ActionListener的通用代码将类似于:

 JButton button = (JButton)e.getSource(); JPanel buttonPanel = (JPanel)button.getParent(); JPanel cardLayoutPanel = (JPanel)buttonPanel.getParent(); CardLayout layout = (CardLayout)cardLayoutPanel.getLayout(); layout.show(cardLayoutPanel, "2"); 

希望这可以帮助。

 package cardlayoutsample; import java.awt.CardLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class CardLayoutSample { JFrame frame = new JFrame("CardLayout Demo"); JPanel panelCont = new JPanel(); JPanel panelFirst = new JPanel(); JPanel panelSecond = new JPanel(); JButton btnOne = new JButton("Switch"); JButton btnTwo = new JButton("Back"); CardLayout cl = new CardLayout(); public CardLayoutSample(){ panelCont.setLayout(cl); panelFirst.add(btnOne); panelSecond.add(btnTwo); panelFirst.setBackground(Color.red); panelSecond.setBackground(Color.blue); panelCont.add(panelFirst,"1"); panelCont.add(panelSecond,"2"); cl.show(panelCont, "1"); btnOne.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0){ cl.show(panelCont, "2"); } }); btnTwo.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0){ cl.show(panelCont, "1"); } }); frame.add(panelCont); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); frame.setLocationRelativeTo(null); } public static void main(String[] args) { CardLayoutSample a = new CardLayoutSample(); } } 

尝试播放此按钮,您可以看到单击按钮时切换面板。

ActionListener的语法

 Component.addActionListener(new ActionListener (){ @Override public void actionPerformed(ActionEvent e){ //do this } }); 

 LogoutButton.addActionListener(new ActionListener (){ @Override public void actionPerformed(ActionEvent e){ System.exit(0); } });