2014-09-27 46 views
0

我正在處理的Java應用程序中如何正確構建GUI,我有一個問題。我有一個主窗口(JFrame),我想在其中放置GUI元素(按鈕,文本標籤等)和控制檯窗口的組合。那麼我應該使用兩個JPanel來做到這一點嗎?在桌面Java應用程序中構建GUI時使用哪種佈局/佈局組合

在第一個JPanel(?)上將會出現一個按鈕,通過點擊哪個其他JPanel(?)將用它自己的GUI元素打開。這個新打開的面板必須覆蓋所有JFrame的空間,另外這個過程必須前後移動,所以我應該使用CardLayout來實現它嗎?如果是這樣的話,我將在主窗口中使用什麼佈局?如果嵌套佈局是一個選項,有人可以給我建議構建應用程序的「骨架」嗎?

此外控制檯的大小必須保持不變。

+0

*「這個新開業面板必須涵蓋所有Jframe的空間,另外這個過程必須是前進和後退」 *什麼組件將用戶移回原始屏幕?爲什麼不把該組件放在「必須覆蓋所有屏幕」組件? – 2014-09-27 07:20:00

+0

答案是:*它取決於* - 正如此,將其標記爲「太寬」 – vaxquis 2014-09-27 07:22:12

+0

@AndrewThompson更少?建立Windows的複雜性或簡單的後退導航,您的選擇先生?示例:選項菜單,文件菜單或任何其他定製屏幕。我很欣賞你的意見。非常感謝。 – iColdBeZero 2014-09-27 07:24:45

回答

2

從你的描述,似乎UI要求是這樣的:

GUI shown a little larger than natural size
顯示GUI比自然大小

GUI showing the 'big thing' (in green) with toolbar at top
GUI顯示 '大事情' 大一點(綠色)帶頂部工具欄

GUI showing the 'big thing' (in green) with floating toolbar
GUI顯示浮動工具欄的「大事情」(綠色)

import java.awt.*; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 

public class ConsoleGUI { 

    JPanel ui; 
    String[] cards = {"Console", "Big Component"}; 
    CardLayout cardLayout; 
    JPanel cardPanel; 

    public ConsoleGUI() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui == null) { 
      ui = new JPanel(new BorderLayout()); 

      JToolBar tools = new JToolBar(); 
      ui.add(tools, BorderLayout.PAGE_START); 
      tools.add(new JButton("Open")); 
      tools.add(new JButton("Save")); 
      tools.addSeparator(); 
      tools.add(new CardFlipperAction(cards[0])); 
      tools.add(new CardFlipperAction(cards[1])); 

      cardLayout = new CardLayout(); 
      cardPanel = new JPanel(cardLayout); 
      ui.add(cardPanel, BorderLayout.CENTER); 

      JTextArea console = new JTextArea(3, 40); 
      JPanel consoleContainer = new JPanel(new GridBagLayout()); 
      consoleContainer.add(new JScrollPane(console)); 
      cardPanel.add(cards[0], consoleContainer); 
      JPanel bigThing = new JPanel(new GridLayout()); 
      bigThing.setBackground(Color.GREEN.darker()); 
      cardPanel.add(cards[1], bigThing); 
     } 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    class CardFlipperAction extends AbstractAction { 

     CardFlipperAction(String name) { 
      super(name); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      cardLayout.show(cardPanel, e.getActionCommand()); 
     } 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       ConsoleGUI cg = new ConsoleGUI(); 
       JFrame f = new JFrame("Console GUI"); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setContentPane(cg.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 
       f.setLocationByPlatform(true); 
       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
}