2017-08-30 40 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); 
相关问题