点击按钮时如何将Jpanel替换为jframe上的另一个jpanel

问题描述:

当按下框架左侧的JPanel中存在的相应按钮时,我想要替换框架中央的JPanel。 我正在使用cardlayout替换中心的面板。 这里是我用于更改按钮单击面板上的示例代码,但它不起作用。任何人都可以让我知道代码中的最新错误。点击按钮时如何将Jpanel替换为jframe上的另一个jpanel

库扩展的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并有多个按钮它。内部类的它ButtonHandler器具HTE 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"); 
       } 

的SelectedPanel应在帧的中央显示的替换的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; 
+1

你有没有动作监听器添加到些什么呢? – Cruncher

+1

请提供一个简单,简短,可编辑和完整的示例,[SSCCE](http://sscce.org/),以获得更好的帮助。 :-)一个相关的[示例](http://stackoverflow.com/a/9349137/1057230),同时提供一些帮助:-) –

+1

对于一个空间中的许多组件,使用['CardLayout']( http://docs.oracle.com/javase/7/docs/api/java/awt/CardLayout.html)在这[简短示例](http://stackoverflow.com/a/5786005/418556)中可见。 –

我创建了一个例子给你,看看该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(); 
      } 
     }); 
    } 
} 
+1

时,它现在可以工作尽管你提供的例子对于这个:-)来说是很好的+1,但是它不被认为是一个好习惯,当Swing已经有一个可以处理这种情况的Layout Manager时()/ repaint()'-1,另外,OP使用'CardLayout',它不是像'revalidate()/ repaint()'这样的调用的从属设备:-) –

+0

谢谢为答复。但有8个按钮,每按一下按钮,我需要更换面板。我在网上看到的所有例子都是在2个面板之间切换的。所以我实现了cardlayout。我找出了我的代码的问题。我dint声明showReplacePanel()方法和cardPanel为静态。在将htem声明为静态之后,面板被替换。 – anu