如何通过外部 ActionListeners 在 CardLayout 中的面板之间切换 类

How to Switch between Panels in CardLayout from ActionListeners in external classes

我在主 class 中有一个 cardLayout,通过面板将 Gui classes 添加到布局中,当按下 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

 }

希望对您有所帮助。

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);
 }
  });

ActionEvent 将包含生成事件的源对象。在本例中是 JButton。因此,您的 GUI1 class 中 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");