2016-04-15 6 views
0

Ich habe einen JFrame, der auf einer Seite in zwei geteilt ist Ich habe ein JPanel mit einigen JToggleButtons. auf der anderen Seite muss ich das richtige JPanel zeigen, wenn eines der JToggleButtons angeklickt wird. Im Moment verwende ich nur einen Thread, um dies zu tun.Ich brauche ein JPanel, das angezeigt wird, wenn ich auf einen JToggleButton klicke

hier ist die 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); 
    } 
} 

hier ist die JPanel die JToggleButtons hält (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()); 
     } 
    } 
} 

Kann mir jemand sagen, wie kann ich diese Platten in den Rahmen zu öffnen, wenn das Ereignis ausgelöst wird . danke

+1

[So verwenden Cardlayout] (http://docs.oracle.com/javase/tutorial/uiswing /layout/card.html) – MadProgrammer

+0

Ich hatte es wirklich schwer nach Referenzen zu suchen, wie man das macht. Danke – LH88

Antwort

1

Die grundlegende Antwort ist die Verwendung eines CardLayout, siehe How to Use CardLayout für weitere Details.

Es gibt so viele Möglichkeiten, wie Sie dies tun können, aber ich bevorzuge eine Art von "Navigations-Controller", die für die schmutzigen Details tatsächlich verantwortlich ist, damit es funktioniert, das bedeutet, wenn Sie sich entscheiden die Art und Weise Sie Ansichten wechseln, die Reset Ihres Code kümmert sich nicht darum, zum Beispiel ...

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

Schöne Lösung, Danke – LH88