Java 单击按钮时如何在jframe上用另一个jpanel替换jpanel

Java 单击按钮时如何在jframe上用另一个jpanel替换jpanel,java,swing,actionlistener,cardlayout,Java,Swing,Actionlistener,Cardlayout,我希望在按下帧左侧JPanel中的相应按钮时,替换帧中心的JPanel。 我正在使用cardlayout替换中心的面板。 下面是我用来在单击按钮时更改面板的示例代码,但它不起作用。谁能告诉我密码有什么问题吗 库扩展了JFrame Public Library(){ Container container = getContentPane(); container.setLayout( new BorderLayout() ); setExtended

我希望在按下帧左侧JPanel中的相应按钮时,替换帧中心的JPanel。 我正在使用cardlayout替换中心的面板。 下面是我用来在单击按钮时更改面板的示例代码,但它不起作用。谁能告诉我密码有什么问题吗

库扩展了JFrame

 Public Library(){
          Container container = getContentPane();
      container.setLayout( new BorderLayout() );
      setExtendedState(JFrame.MAXIMIZED_BOTH);

      banner = new BannerPanel();
      container.add(banner,BorderLayout.NORTH);

      MenuButtons = new MenuButtonPanel();
      container.add(MenuButtons,BorderLayout.WEST);

      SelectedButtonPanel = new SelectedPanel(container);

      setLocationRelativeTo(null);
      setVisible( true );
      init();

      setDefaultCloseOperation(EXIT_ON_CLOSE);
}
MenuButtonPanel扩展了JPanel,其中包含多个按钮。it ButtonHandler的内部类实现了按钮的actionListner

 //inner class
   class ButtonEventHandler implements ActionListener {     
        public void actionPerformed( ActionEvent event ){

            SelectedPanel selectObj = new SelectedPanel();

            if("about".equals(event.getActionCommand()))
                {
                    selectObj.showReplacePanel("about");

                }
                else if("checkout".equals(event.getActionCommand()))
                {
                    selectObj.showReplacePanel("checkout");
                }
                else if("search".equals(event.getActionCommand()))
                {
                    selectObj.showReplacePanel("search");
                }
所选面板应在框架中心显示替换的Jpanel

    public SelectedPanel() {}

public SelectedPanel(Container framePane)
{
    addSelectedPanel(framePane);
}
public void addSelectedPanel(Container framePane)
{
    cardPanel = new JPanel();
    //set layout of panel
    cardPanel.setLayout(new CardLayout());
    cardPanel.setBorder(null);
    cardPanel.setForeground(new Color(0, 0, 0));
    //this.selObj = selObj;
            aboutPanel = new About();
            checkoutPanel = new Checkout();
            searchPanel = new Search();
                           cardPanel.add(aboutPanel,ABOUTBUTTON);
            cardPanel.add(checkoutPanel,CHECKOUTBUTTON);
            cardPanel.add(searchPanel, SEARCHBUTTON);
                             framePane.add(cardPanel, BorderLayout.CENTER);  }
selectedPanel类还有showReplacePanel()方法,该方法在buttonClick的actionPerformed中调用

public void showReplacePanel(String selObj)
{
    System.out.println("cardlayout entered");
    CardLayout cl = (CardLayout)(cardPanel.getLayout());
    System.out.println("cardlayout entered");
    switch(selObj){        
    case "about":

        cl.show(cardPanel,ABOUTBUTTON);
                break;          
    case "search":
        //this.repPanel = searchPanel;
        cl.show(cardPanel,SEARCHBUTTON);
        break;
    case "checkout":
        cl.show(cardPanel,CHECKOUTBUTTON);
        //this.repPanel = checkoutPanel;
        break;

我为您创建了一个示例,看看
actionPerformed(ActionEvent e)
方法

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PanelSwap extends JPanel implements ActionListener {

    JPanel firstPanel = new JPanel();
    JPanel secondPanel = new JPanel();

    public PanelSwap() {
        super(new BorderLayout());
        firstPanel.setBackground(Color.RED);

        secondPanel.setBackground(Color.YELLOW);

        JButton swap1 = new JButton("SwapToYellow");
        swap1.addActionListener(this);

        JButton swap2 = new JButton("SwapToRed");
        swap2.addActionListener(this);

        firstPanel.add(swap1);
        secondPanel.add(swap2);

        add(firstPanel);
    }

    /** Listens to the buttons and perfomr the swap. */
    public void actionPerformed(ActionEvent e) {

        for (Component component : getComponents())
            if (firstPanel == component) {
                remove(firstPanel);
                add(secondPanel);

            } else {
                remove(secondPanel);
                add(firstPanel);
            }

        repaint();
        revalidate();
    }

    /**
     * Create the GUI and show it. For thread safety, this method should be
     * invoked from the event-dispatching thread.
     */
    private static void createAndShowGUI() {
        // Create and set up the window.
        JFrame frame = new JFrame("PanelSwap");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Create and set up the content pane.
        JComponent newContentPane = new PanelSwap();
        newContentPane.setOpaque(true); // content panes must be opaque
        frame.setContentPane(newContentPane);

        // Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        // Schedule a job for the event-dispatching thread:
        // creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

您是否将操作侦听器添加到某个内容中?请提供一个简单、简短、可编译且完整的示例a,以获得更好的帮助。:-)一个相关的,同时需要一些帮助:-)对于一个空间中的许多组件,请使用如图所示的。我忘了将cardPanel和ShowRepalCheckPanel设置为静态。一旦我宣布,它现在就可以工作了,尽管您给出的示例在这方面是好的+1:-),但当
Swing
已经有一个
Layout Manager
可以处理这种情况并取消
revalidate()/repaint()
-1时,它被认为不是一个好的实践,因为这个原因:(.此外,OP使用的是
CardLayout
,它不是像
revalidate()/repaint()
:-)这样的调用的从属)谢谢你的回复。但是有8个按钮,每次点击按钮我都需要更改面板。我在网上看到的所有示例都是用于在2个面板之间切换的。因此我实现了cardlayout。我解决了代码中的问题。我无法声明showReplacePanel()方法和cardPanel为静态。将htem声明为静态后,将替换面板。