我是Java Swing的新手,对不同的布局管理员我不太熟悉。我应该在3个面板和一个菜单栏上使用哪种布局?
我想创造一个有3个面板,顶部一个菜单栏的框架如下所示:
我曾试图边框布局,但如果有泉它只能没有菜单栏。我应该使用什么布局管理器?
我是Java Swing的新手,对不同的布局管理员我不太熟悉。我应该在3个面板和一个菜单栏上使用哪种布局?
我想创造一个有3个面板,顶部一个菜单栏的框架如下所示:
我曾试图边框布局,但如果有泉它只能没有菜单栏。我应该使用什么布局管理器?
你应该使用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);
}
}
提问者似乎想要3个面板不同的高度。 但是通过使用'GridLayout',他们将获得相同的高度。 –
我建议创建一个自定义的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);
的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);
这个[视觉指南](https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)总是学习Java Swing并看看可以做什么的好开始。 – AxelH
'BorderLayout'不排除使用'JMenuBar',因为[示例](https://stackoverflow.com/a/38215252/230513)。 – trashgod
菜单栏是框架的一部分。阅读Swing教程中关于[如何使用菜单]的部分(http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html),了解工作演示代码以帮助您入门。 – camickr