尝试在Swing中构建此GUI:
在我的MainFrame中,我设置了一个GridLayout来实现1行,2列:
setLayout(new GridLayout(1, 2));
在左栏中,我需要一个GridBagLayout,如右栏所示。普通的GridLayout不再起作用,因为我希望每行的大小不同。对于左栏我尝试了这个:
GridBagConstraints gbc = new GridBagConstraints();
mapPanel = new MapPanel(map);
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridheight = 10;
add(mapPanel, gbc);
controlPanel = new JPanel();
controlPanel.add(new JButton("Test"));
controlPanel.add(new JButton("Test 2"));
controlPanel.add(new JButton("Test 3"));
controlPanel.add(new JButton("Test 4"));
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridheight = 1;
add(controlPanel, gbc);
logPanel = new LogPanel();
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 0;
gbc.gridy = 2;
gbc.gridheight = GridBagConstraints.REMAINDER;
add(logPanel, gbc);
然而,这将导致所有东西被包装在一起"在左栏中。它不会扩展到柱子的100%高度和50%宽度。如何在图片中实现GUI?
谢谢!
答案 0 :(得分:2)
看看JNodeLayout。 RectNode正是您所需要的。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import com.smartg.swing.layout.JNodeLayout;
import com.smartg.swing.layout.LayoutNode.RectNode;
public class RectNodeDemo {
public static void main(String[] args) {
String rootName = "root";
RectNode root = new RectNode(rootName);
JNodeLayout layout = new JNodeLayout(root);
layout.setHgap(1);
layout.setVgap(1);
JPanel target = new JPanel();
target.setBorder(new EmptyBorder(10, 10, 10, 10));
target.setLayout(layout);
addPanel(target, root, new Rectangle2D.Double(0, 0, .5, .5));
addPanel(target, root, new Rectangle2D.Double(0, .5, .5, .1));
addPanel(target, root, new Rectangle2D.Double(0, .6, .5, .4));
addPanel(target, root, new Rectangle2D.Double(.5, 0, .5, .9));
addPanel(target, root, new Rectangle2D.Double(.5, .9, .5, .1));
layout.syncNodes();
JFrame frame = new JFrame();
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(target, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
static void addPanel(JPanel target, RectNode node, Rectangle2D r) {
JPanel p = new JPanel();
target.add(p);
p.setBorder(new LineBorder(Color.BLACK, 1));
node.add(p, r);
}
}
答案 1 :(得分:2)
您可以使用Relative Layout。此布局允许您指定每个组件的相对大小。
要在左侧创建面板,代码将类似于:
RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS);
rl.setFill( true );
JPanel left = new JPanel( rl );
left.add(panel1, new Float(50));
left.add(panel2, new Float(10));
left.add(panel3, new Float(40));
答案 2 :(得分:0)
仅使用GridBagLayout
即可。
通过设置gbc.gridheight = 10
,您可以告诉GridBag为组件使用10行。 (类似于HTML中的rowspan
。)但是,这并未说明组件的实际高度,因为行没有固定的高度。因此,当您仅使用单个列时,此约束不会产生任何影响。约束的名称是恕我直言,令人困惑。
使用GridBagConstraints.weightx
和GridBagConstraints.weighty
指定额外空间应该去的位置。有关详情,请参阅How to Use GridBagLayout。
结合组件的首选尺寸,您将能够获得一个面板,当面板较小时,该面板将显示您的组件,并在面板“太大”时分配额外的空间。
尽管正如Andrew Thompson指出的那样,使用setPreferredSize()
并不是一个很好的方法。通常,组件已经具有其构造的优选尺寸。只需使用GridBagConstraints
的所有内容,看看会发生什么。
这最终可能是一个更好看的解决方案。