我曾经有一个带有2个组件的jframe,每个组件占用了宽度的一半和所有高度:
我用一个有2列1行的gridlayout实现了这个目的,效果很好。虽然现在我想在右边的组件下面添加第三个组件:
有人知道如何实现这个目标吗?
答案 0 :(得分:5)
您可以尝试嵌套一些JPanel
,例如:
主窗格的FlowLayout
将保留左窗格和右窗格。
在右侧窗格中有一个BoxLayout
或GridLayout
来保存顶部和底部窗格。
在下面的示例代码中,它给出了以下输出
我添加了一些边框颜色以便你可以看到它是如何工作的,我添加了一些标签,因为我太懒了,无法覆盖每个getPreferredSize()
的{{1}},但我想这会给你关于如何从这里开始的想法。
JPanel
注意:为了在上面的示例中在左右窗格中获得相同的维度,我必须覆盖import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class LayoutExample {
private JFrame frame;
private JPanel pane;
private JPanel leftPane;
private JPanel rightPane;
private JPanel topPane;
private JPanel bottomPane;
public static void main (String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new LayoutExample().createAndShowGui();
}
});
}
public void createAndShowGui() {
frame = new JFrame("Layout Example");
pane = new JPanel();
leftPane = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 300);
}
};
rightPane = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 300);
}
};
topPane = new JPanel();
bottomPane = new JPanel();
pane.setLayout(new FlowLayout());
rightPane.setLayout(new GridLayout(2, 1, 5, 5));
rightPane.add(topPane);
rightPane.add(bottomPane);
pane.add(leftPane);
pane.add(rightPane);
pane.setBorder(BorderFactory.createLineBorder(Color.green));
leftPane.setBorder(BorderFactory.createLineBorder(Color.red));
topPane.setBorder(BorderFactory.createLineBorder(Color.black));
bottomPane.setBorder(BorderFactory.createLineBorder(Color.magenta));
frame.setContentPane(pane);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
方法,因为我使用了{{ 1}},在这种情况下,为避免这样做,最好在下面的答案中使用@LukkasRotter提供的2条建议中的任何一条。
答案 1 :(得分:5)
使用嵌套布局,即两个网格布局,或使用GridBagLayout
。
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Example {
public static void main(String[] args) {
new Example().createAndShowGUI();
}
public void createAndShowGUI() {
JPanel nestedPanel = new JPanel(new GridLayout(2, 1, 10, 10));
nestedPanel.add(createBorderedPanel());
nestedPanel.add(createBorderedPanel());
JPanel nestedPanelContainer = new JPanel(new GridLayout(1, 2, 10, 10));
nestedPanelContainer.setBorder(BorderFactory.createTitledBorder("Nested GridLayouts"));
nestedPanelContainer.add(createBorderedPanel());
nestedPanelContainer.add(nestedPanel);
JPanel gridBagPanel = new JPanel(new GridBagLayout());
gridBagPanel.setBorder(BorderFactory.createTitledBorder("GridBagLayout"));
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 1;
constraints.weighty = 1;
constraints.gridheight = 2;
constraints.insets = new Insets(5, 5, 5, 5);
gridBagPanel.add(createBorderedPanel(), constraints);
constraints.gridheight = 1;
constraints.gridx = 1;
gridBagPanel.add(createBorderedPanel(), constraints);
constraints.gridy = 1;
gridBagPanel.add(createBorderedPanel(), constraints);
JPanel contentPane = new JPanel(new GridLayout(1, 2, 5, 5));
contentPane.add(nestedPanelContainer);
contentPane.add(gridBagPanel);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(contentPane);
frame.setSize(800, 600);
frame.setVisible(true);
}
private JPanel createBorderedPanel() {
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
return panel;
}
}