这就是我想要实现的目标:
|--0--|--1--|--2--|--3--|--4--|--5--|--6--|--7--|--8--|--9--|
0 | |JLabe|l----|-----|-----|-----|-----|-----|-----|-----|
1 | | |JLabe|l----|-----|-----|-----|-----|-----|-----|
2 | | | |JLabe|l----|-----|-----|-----|-----|-----|
3 | | | |JLabe|l----|-----|-----|-----|-----|-----|
这是我到目前为止所得到的,这与我所能达到的目标一样接近。
center.setLayout(centerLayout);
JPanel[] card = new JPanel[1]; //update as it gets longer, eventually Scoreboard.LENGTH
card[0] = new JPanel();
GridBagLayout cardLayout = new GridBagLayout();
card[0].setLayout(cardLayout);
cardLayout.setConstraints(winner, new GridBagConstraints(0, 0, 10, 1, 1, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0));
card[0].add(winner);
cardLayout.setConstraints(name, new GridBagConstraints(1, 1, 9, 1, 0.8, 0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0));
card[0].add(name);
cardLayout.setConstraints(with, new GridBagConstraints(2, 2, 8, 1, 0.7, 0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0));
card[0].add(with);
cardLayout.setConstraints(score, new GridBagConstraints(2, 3, 8, 1, 0.7, 0, GridBagConstraints.LAST_LINE_START, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0));
card[0].add(score);
center.add(card[0], "card1");
this.getContentPane().add(center);
由于某种原因,它显示如下:
|--0--|--1--|--2--|--3--|--4--|--5--|--6--|--7--|--8--|--9--|
0 |JLabe|l----|-----|-----|-----|-----|-----|-----|-----|-----|
1 |JLabe|l----|-----|-----|-----|-----|-----|-----|-----|-----|
2 |JLabe|l----|-----|-----|-----|-----|-----|-----|-----|-----|
3 |JLabe|l----|-----|-----|-----|-----|-----|-----|-----|-----|
也许有一种比使用GridBagLayout更合适的方式来布局我的文本。 (它确实需要处理不同的分辨率,因此布局管理器使用的需要灵活)
答案 0 :(得分:1)
1)命名GridBagLayout
变量" cardLayout"不是最好的主意,IMO。
2)由于您只提供了代码段而未提供SSCCE,因此我只能根据"图片"你给了。 GridBagLayout需要每个行/列中的一个组件来定义它的大小。给定的列将与该列中具有最宽的首选大小的组件一样宽。身高也一样。因此,根据结果的图片,没有具有首选宽度的组件位于第0列。一种解决方法是在所需列中放置Box.createHorizontalStrut(someWidth)
。