2016-04-15 13 views
0

私はJFrameを片側に2つに分割しています。JToggleButtonsを持つJPanelを持っています。反対側では、JToggleButtonsの1つがクリックされたときに、正しいJPanelを表示する必要があります。今は、これを行うために1つのスレッドのみを使用しています。ここJToggleButtonをクリックしたときに表示されるJPanelが必要です

がここに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のは

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

(MenuJPanel)をJToggleButtonsを保持しているイベントがトリガされたときに誰かが、私はフレーム内にこれらのパネルを開くことができる方法を教えてもらえます。 ありがとう

+1

/layout/card.html) – MadProgrammer

+0

私はこれを行う方法についての参考文献を探すのは本当に苦労しました。ありがとう – LH88

答えて

1

基本的な答えはCardLayoutです(詳細はHow to Use CardLayoutを参照)。

あなたはこれを行うことができる方法はたくさんありますが、実際には動作させるための汚い内容を世話する責任がある「ナビゲーションコントローラ」を使用することをお勧めします。 http://docs.oracle.com/javase/tutorial/uiswing([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

関連する問題