2016-04-15 74 views
0

我有一個JFrame在一邊分成兩部分我有一個JPanel上有一些JToggleButtons。在另一方面,當單擊一個JToggleButton時,我需要顯示正確的JPanel。現在我只用一個線程來做到這一點。我需要一個JPanel來顯示,當我點擊一個JToggleButton

這裏是JFrame的

public class AppFrame extends JFrame{ 
    private JPanel content ; 
    private JPanel menu; 

    public AppFrame() { 
     super("Title"); 
     setLayout(BorderLayout()); 
     //content is gonna hold JPanel1 or JPanel2 
     content = new JPanel(); 
     menu = new menu(); 
     this.add(menu, BorderLayout.WEST); 
     this.add(content , BorderLayout.CENTER); 
    } 

    public void setContet(JPanel activePanel){ 
     content = activePanel; 
     this.add(content , BorderLayout.CENTER); 
    } 
} 

這裏JPanel中持有JToggleButtons(MenuJPanel)

public class MenuJPanel extends JPanel{ 
private final LayoutManager innerLayout = new GridLayout(3,1,1,1); 
private final JToggleButton button1; 
private final JToggleButton button1; 

public MenuPanel() { 
    super(); 
    SwitchHandler sHandler = new SwitchHandler(); 
    this.setLayout(innerLayout); 
    this.add(button1); 
    this.add(button2); 
    button1.addActionListener(sHandler); 
    button2.addActionListener(sHandler); 
} 

class SwitchHandler implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == button1){ 
      button2.setSelected(false); 
      //at this point I want the frame to display JPanel1 
      //I tried this 
      AppFrame frame = (AppFrame)getTopLevelAncestor(); 
      frame.setContet(new JPanel1()); 
     } else { 
      button1.setSelected(false); 
      //at this point I want the frame to display JPanel2     
      //I tried this 
      AppFrame frame = (AppFrame)getTopLevelAncestor(); 
      frame.setContet(new JPanel2()); 
     } 
    } 
} 

誰能告訴我怎樣才能打開幀這些面板在觸發事件。 謝謝

+1

[如何使用CardLayout(http://docs.oracle.com/javase/tutorial/uiswing /layout/card.html) – MadProgrammer

+0

我真的很難找到如何做到這一點的參考。謝謝 – LH88

回答

1

基本的答案是使用CardLayout,請參閱How to Use CardLayout瞭解更多詳情。

有很多方法可以做到這一點,但我更喜歡使用某種「導航控制器」,它負責實際處理使其工作的骯髒細節,這意味着如果您決定改變你切換視圖的方式,你的代碼的復位不關心,例如...

import java.awt.CardLayout; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.LayoutManager; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JToggleButton; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public enum Page { 
     MENU("menu"), 
     HERE("here"), 
     THERE("there"); 

     private String pageName; 

     private Page(String name) { 
      pageName = name; 
     } 

     public String getPageName() { 
      return pageName; 
     } 

    } 

    public interface Navigator { 
     public void showPage(Page page); 
    } 

    public class TestPane extends JPanel implements Navigator { 

     private CardLayout cardLayout; 

     public TestPane() { 
      cardLayout = new CardLayout(); 
      setLayout(cardLayout); 
      add(new MenuPanel(this), Page.MENU.getPageName()); 
      add(new StuffOverHere(), Page.HERE.getPageName()); 
      add(new StuffOverThere(), Page.THERE.getPageName()); 
      showPage(Page.MENU); 
     } 

     @Override 
     public void showPage(Page page) { 
      cardLayout.show(this, page.getPageName()); 
     } 

    } 

    public class StuffOverHere extends JPanel { 

     public StuffOverHere() { 
      setLayout(new GridBagLayout()); 
      JLabel label = new JLabel("Over here"); 
      add(label); 
     } 

    } 
    public class StuffOverThere extends JPanel { 

     public StuffOverThere() { 
      setLayout(new GridBagLayout()); 
      JLabel label = new JLabel("Over there"); 
      add(label); 
     } 

    } 

    public class MenuPanel extends JPanel { 

     private final LayoutManager innerLayout = new GridLayout(3, 1, 1, 1); 
     private final JToggleButton button1 = new JToggleButton("Stuff over here"); 
     private final JToggleButton button2 = new JToggleButton("Stuff over there"); 

     private Navigator navigator; 

     public MenuPanel(Navigator navigator) { 
      super(); 
      SwitchHandler sHandler = new SwitchHandler(); 
      this.setLayout(innerLayout); 
      this.add(button1); 
      this.add(button2); 
      button1.addActionListener(sHandler); 
      button2.addActionListener(sHandler); 
      this.navigator = navigator; 
     } 

     class SwitchHandler implements ActionListener { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (e.getSource() == button1) { 
        navigator.showPage(Page.HERE); 
       } else { 
        navigator.showPage(Page.THERE); 
       } 
      } 
     } 
    } 
} 
+0

很好的解決方案,謝謝 – LH88

相關問題