2013-02-17 61 views
1

我需要創建一個應用程序與單個窗口,沒有任何彈出窗口。一切工作使用相同的窗口,只改變內容。我將使用swing創建應用程序。java單框架應用程序

我已閱讀Java: single frame vs multiple frames,但我認爲這不符合我的要求,因爲應用程序的增長會讓維護變得更加困難。

我想要有MVC設計。我正在考慮創建一些堆棧的控制器,其中控制器將加載視圖和模型。所以當我需要返回時只需彈出電流控制器並使用前一個。我的設計可能是錯誤的,如果任何人有任何建議如何實現這樣的應用程序隨意發表評論。

感謝您的時間。

我已經嘗試創建原型類,它將容納堆棧的容器切換。

public class WindowManager 
{ 
protected Stack<Container> frames;// contains frames stack to navigate 
protected JFrame wnd; // frame to show 

public WindowManager() 
{ 
    this.frames = new Stack<>(); 
    this.wnd = new JFrame(); 
    wnd.setSize(640, 480); 
    //wnd.setVisible(true); 
} 

public void addFrame(Container c) 
{ 
    this.frames.push(this.wnd.getContentPane()); 
    this.wnd.setContentPane(c); 
} 

public WindowManager removeFrame() 
{ 
    Container c = this.frames.pop(); 
    wnd.setContentPane(c); 
    return this; 
} 

public void showWindow() 
{ 
    wnd.setVisible(true); 
} 

}

代替容器堆棧會有控制器棧將加載視圖和模型。

+0

你能告訴我們你試過了什麼嗎? – 2013-02-17 17:13:00

+0

頂級設計的某些方面可能反映了您的遏制層級,但MVC與此正交。另請參閱本[問與答](http://stackoverflow.com/q/9554636/230513)。 – trashgod 2013-02-17 17:19:43

回答

2

您應該創建幾個JPanel對象並將它們放入CardLayout,因此一次只能看到一個頁面。請看下面的例子:

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.Box; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class CardLayoutExample extends JFrame 
{ 
    public CardLayoutExample() 
    { 
     setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     getContentPane().setLayout (new CardLayout()); 
     getContentPane().add (new Fruits(), "Fruits"); 
     getContentPane().add (new Seasons(), "Seasons"); 
     getContentPane().add (new Colors(), "Colors"); 
     getContentPane().add (new Towns(), "Towns"); 
    } 

    public void switchTo (String page) 
    { 
     ((CardLayout)getContentPane().getLayout()).show (getContentPane(), page); 
    } 

    public static void main (String [] args) 
    { 
     SwingUtilities.invokeLater (new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       CardLayoutExample example = new CardLayoutExample(); 
       example.pack(); 
       example.setVisible (true); 
      } 
     }); 
    } 

    private class Colors extends JPanel 
    { 
     public Colors() 
     { 
      Box box = Box.createHorizontalBox(); 
      box.add (new JButton (new AbstractAction("Red") 
      { 
       @Override 
       public void actionPerformed (ActionEvent e) 
       { 
        switchTo ("Fruits"); 
       } 
      })); 
      box.add (Box.createHorizontalStrut (8)); 
      box.add (new JButton (new AbstractAction("Green") 
      { 
       @Override 
       public void actionPerformed (ActionEvent e) 
       { 
        switchTo ("Seasons"); 
       } 
      })); 
      box.add (Box.createHorizontalStrut (8)); 
      box.add (new JButton (new AbstractAction("Blue") 
      { 
       @Override 
       public void actionPerformed (ActionEvent e) 
       { 
        switchTo ("Towns"); 
       } 
      })); 

      setLayout (new BorderLayout()); 
      add (box, BorderLayout.CENTER); 
     } 
    } 

    private class Fruits extends JPanel 
    { 
     public Fruits() 
     { 
      Box box = Box.createVerticalBox(); 
      box.add (new JButton (new AbstractAction("Apple") 
      { 
       @Override 
       public void actionPerformed (ActionEvent e) 
       { 
        switchTo ("Colors"); 
       } 
      })); 
      box.add (Box.createVerticalStrut (8)); 
      box.add (new JButton (new AbstractAction("Orange") 
      { 
       @Override 
       public void actionPerformed (ActionEvent e) 
       { 
        switchTo ("Seasons"); 
       } 
      })); 
      box.add (Box.createVerticalStrut (8)); 
      box.add (new JButton (new AbstractAction("Pear") 
      { 
       @Override 
       public void actionPerformed (ActionEvent e) 
       { 
        switchTo ("Towns"); 
       } 
      })); 

      setLayout (new BorderLayout()); 
      add (box, BorderLayout.CENTER); 
     } 
    } 

    private class Seasons extends JPanel 
    { 
     public Seasons() 
     { 
      Box box = Box.createHorizontalBox(); 
      box.add (new JButton (new AbstractAction("Winter") 
      { 
       @Override 
       public void actionPerformed (ActionEvent e) 
       { 
        switchTo ("Colors"); 
       } 
      })); 
      box.add (Box.createHorizontalStrut (8)); 
      box.add (new JButton (new AbstractAction("Spring") 
      { 
       @Override 
       public void actionPerformed (ActionEvent e) 
       { 
        switchTo ("Fruits"); 
       } 
      })); 
      box.add (Box.createHorizontalStrut (8)); 
      box.add (new JButton (new AbstractAction("Summer") 
      { 
       @Override 
       public void actionPerformed (ActionEvent e) 
       { 
        switchTo ("Towns"); 
       } 
      })); 

      setLayout (new BorderLayout()); 
      add (box, BorderLayout.CENTER); 
     } 
    } 

    private class Towns extends JPanel 
    { 
     public Towns() 
     { 
      Box box = Box.createVerticalBox(); 
      box.add (new JButton (new AbstractAction("Moscow") 
      { 
       @Override 
       public void actionPerformed (ActionEvent e) 
       { 
        switchTo ("Colors"); 
       } 
      })); 
      box.add (Box.createVerticalStrut (8)); 
      box.add (new JButton (new AbstractAction("London") 
      { 
       @Override 
       public void actionPerformed (ActionEvent e) 
       { 
        switchTo ("Fruits"); 
       } 
      })); 
      box.add (Box.createVerticalStrut (8)); 
      box.add (new JButton (new AbstractAction("Tokyo") 
      { 
       @Override 
       public void actionPerformed (ActionEvent e) 
       { 
        switchTo ("Seasons"); 
       } 
      })); 

      setLayout (new BorderLayout()); 
      add (box, BorderLayout.CENTER); 
     } 
    } 
}