2017-08-30 43 views
-2

我是Java Swing的新手,對不同的佈局管理員我不太熟悉。我應該在3個面板和一個菜單欄上使用哪種佈局?

我想創造一個有3個面板,頂部一個菜單欄的框架如下所示:

enter image description here

我曾試圖邊框佈局,但如果有泉它只能沒有菜單欄。我應該使用什麼佈局管理器?

+2

這個[視覺指南](https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)總是學習Java Swing並看看可以做什麼的好開始。 – AxelH

+0

'BorderLayout'不排除使用'JMenuBar',因爲[示例](https://stackoverflow.com/a/38215252/230513)。 – trashgod

+0

菜單欄是框架的一部分。閱讀Swing教程中關於[如何使用菜單]的部分(http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html),瞭解工作演示代碼以幫助您入門。 – camickr

回答

0

你應該使用GridLayout,你可以指定行和列的數量並向它添加元素,例如,如果你說你想要2行和3列並開始向它添加元素,那麼首先3將行第1行和第2行3將進入第二行,你基本上創建一個表格,並從上到下(默認情況下)從左到右填充單元格,所以在你的情況下,你將需要3行和一列無論如何這裏是一個例子,將幫助你

public class GridLayoutTut { 
private JFrame mainFrame; 

public static void main(String[] args) { 
    GridLayoutTut swingLayoutDemo = new GridLayoutTut(); 
    swingLayoutDemo.showStuff(); 
} 

private void showStuff() { 
    JMenuBar menuBar = new JMenuBar(); 
    JMenu menu; 
    menu = new JMenu("My menu"); 
    menuBar.add(menu); 

    mainFrame = new JFrame("Java SWING Examples"); 
    mainFrame.setSize(400, 400); 
    JPanel comp = new JPanel(); 
    comp.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Pane 1")); 
    JPanel comp2 = new JPanel(); 
    comp2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Pane 2")); 
    JPanel comp3 = new JPanel(); 
    comp3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Pane 3")); 

    mainFrame.setLayout(new GridLayout(3, 1)); // 3 rows 1 column 
    mainFrame.add(comp); 
    mainFrame.add(comp2); 
    mainFrame.add(comp3); 
    mainFrame.add(menuBar); 
    mainFrame.setJMenuBar(menuBar); 
    mainFrame.setVisible(true); 
} 

}

+2

提問者似乎想要3個面板不同的高度。 但是通過使用'GridLayout',他們將獲得相同的高度。 –

0

我建議創建一個自定義的LayoutManager。

這是一個基本的不只是你問的是什麼:

import java.awt.*; 
import java.util.ArrayList; 

public class MyLayoutManager implements LayoutManager { 
    private final int TOOLBAR_HEIGHT = 30; 
    private final int WINDOW_WIDTH = 800; 
    private final int WINDOW_HEIGHT = 600; 

    // CONSTRAINTS // 
    public static final String TOOLBAR = "TOOLBAR"; 
    public static final String BODY = "BODY"; 

    private ArrayList<Component> toolbarComponents = new ArrayList<>(); 
    private ArrayList<Component> bodyComponents = new ArrayList<>(); 

    @Override // Called when JFrame.add() is used // 
    public void addLayoutComponent(String constraints, Component component) { 

     switch(constraints) { 
      case "TOOLBAR": toolbarComponents.add(component); break; 
      case "BODY": bodyComponents.add(component);  break; 
     } 
    } 


    @Override // Sets the bounds for each component // 
    public void layoutContainer(Container parent) { 
     // Toolbar // 
     int currentWidth = 0; 
     for(Component c : toolbarComponents) { 
      int width = c.getPreferredSize().width; 
      c.setBounds(currentWidth, 0, width, TOOLBAR_HEIGHT); 
      currentWidth += width; 
     } 

     // Body // 
     int currentHeight = TOOLBAR_HEIGHT; 
     for(Component c : bodyComponents) { 
      int height = (parent.getHeight()-TOOLBAR_HEIGHT)/bodyComponents.size(); 
      c.setBounds(0, currentHeight, parent.getWidth(), height); 
      currentHeight += height; 
     } 
    } 


    @Override 
    public Dimension minimumLayoutSize(Container parent) { 
     return preferredLayoutSize(parent); 
    } 


    @Override // Called when JFrame.pack() is called // 
    public Dimension preferredLayoutSize(Container parent) { 
     return new Dimension(WINDOW_WIDTH,WINDOW_HEIGHT); 
    } 


    @Override 
    public void removeLayoutComponent(Component comp) {} 

} 

然後實現它像這樣:

JFrame frame = new JFrame("Interface"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLayout(new MyLayoutManager()); 

    frame.add(new JButton("Menu"), MyLayoutManager.TOOLBAR); 
    frame.add(new JButton("File"), MyLayoutManager.TOOLBAR); 
    frame.add(new JButton("Settings"), MyLayoutManager.TOOLBAR); 

    JTextArea area1 = new JTextArea(); 
    area1.setBorder(new TitledBorder("title 1")); 

    JTextArea area2 = new JTextArea(); 
    area2.setBorder(new TitledBorder("title 2")); 

    frame.add(area1, MyLayoutManager.BODY); 
    frame.add(area2, MyLayoutManager.BODY); 

    frame.pack(); 

    frame.setVisible(true); 
0

JFrame類有一個setJMenuBar(JMenuBar)方法, 從而使JMenuBar將自動出現在JFrame的頂部。我想推薦GridBagLayout。 通過添加您的3個不同的面板GridBagConstraints 你可以調整他們的大小/位置JFrame。 對於這些的含義,您需要閱讀GridBagConstraints的javadoc。

JFrame frame = new JFrame("Test"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JMenuBar menuBar = new JMenuBar(); 
    JMenu menu1 = new JMenu("Menu1"); 
    JMenu menu2 = new JMenu("Menu2"); 
    JMenu menu3 = new JMenu("Menu3"); 
    menuBar.add(menu1); 
    menuBar.add(menu2); 
    menuBar.add(menu3); 
    frame.add(menuBar); 
    frame.setJMenuBar(menuBar); 

    JPanel panel1 = new JPanel(); 
    panel1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Panel 1")); 
    JPanel panel2 = new JPanel(); 
    panel2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Panel 2")); 
    JPanel panel3 = new JPanel(); 
    panel3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Panel 3")); 

    frame.setLayout(new GridBagLayout()); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.fill = GridBagConstraints.BOTH; 
    gbc.weightx = 1; 
    gbc.gridy = 0; 
    gbc.weighty = 0.1; 
    frame.add(panel1, gbc); 
    gbc.gridy = 1; 
    gbc.weighty = 0.3; 
    frame.add(panel2, gbc); 
    gbc.gridy = 2; 
    gbc.weighty = 0.2; 
    frame.add(panel3, gbc); 

    frame.setSize(400, 400); 
    frame.setVisible(true); 
相關問題