我真的在努力创建复杂的布局。这是我最终想要的图片:
我试图划分和征服,创建小面板并将其放入其他面板中。首先,我想到了一个主容器面板的borderlayout,它位于最初的JFrame中,在这些窗格中有一堆GridBagLayouts用于细节。当那个没有工作时,我想我会尝试全力以赴的GridBagLayout。现在我的目标是让顶层的角色和位置面板/卡片以正确的宽高比(大约4:3)显示并让它们正确调整大小(尽可能保持宽高比),因为窗口调整大小。当窗口第一次出现时,我得到的是每张卡的超小方块面板。我希望他们从宽高比(4:3)开始,一开始。
我是否正确地解决了这个问题?
我应该坚持使用所有GridBagLayouts吗?
如果没有,您认为哪些布局组合可能有效?
最后也可能最重要的是,他们怎么不以正确的网格宽度或网格高度开始呢?
当窗口接近4:3时,如果所有卡片保持4:3或3:4的宽高比,那将是很好的。
public class OverPower {
public static void main(String[] args) {
JFrame table = new JFrame();
table.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
table.setLayout(new BorderLayout());
JPanel contentPane = new OppCharsPanel();
table.setContentPane(contentPane);
table.setLocationByPlatform(true);
table.pack();
table.setLocationRelativeTo(null);
table.setVisible(true);
}
}
public class OppCharsPanel extends JPanel {
public OppCharsPanel() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(20, 15, 20, 15);
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 4;
gbc.gridheight = 3;
gbc.weightx = 4.0;
gbc.weighty = 3.0;
//back row
gbc.gridx = 4;
gbc.gridy = 0;
JPanel oppHomebase = new JPanel();
oppHomebase.setBackground(Color.RED);
this.add(oppHomebase, gbc);
gbc.gridx = 8;
gbc.gridy = 0;
JPanel oppReserve = new JPanel();
oppReserve.setBackground(Color.RED);
this.add(oppReserve, gbc);
//front row
gbc.gridx = 0;
gbc.gridy = 3;
JPanel oppBattlesite = new JPanel();
oppBattlesite.setBackground(Color.RED);
this.add(oppBattlesite, gbc);
gbc.gridx = 4;
gbc.gridy = 3;
JPanel oppChar1 = new JPanel();
oppChar1.setBackground(Color.RED);
this.add(oppChar1, gbc);
gbc.gridx = 8;
gbc.gridy = 3;
JPanel oppChar2 = new JPanel();
oppChar2.setBackground(Color.RED);
this.add(oppChar2, gbc);
gbc.gridx = 12;
gbc.gridy = 3;
JPanel oppChar3 = new JPanel();
oppChar3.setBackground(Color.RED);
this.add(oppChar3, gbc);
}
}
答案 0 :(得分:3)
首先将每个布局部分分解为个别要求,并专注于这些需求,例如......
好的,基本上,这有三个主要组成部分(每个彩色部分都是它自己的面板),可以与BorderLayout
所以在这里,你有另外三个区域/面板,由于对垂直空间的不同要求,我可能想要使用GridBagLayout
,这将允许你为两个顶部组件定义更多空间然后最底层的......
所以,又是三个主要领域。在这里,我很想再次使用BorderLayout
。对于单个容器,我可以使用GridBagLayout
或Rob Camick's WrapLayout
(用于在三个区域中的每个区域内布置图像)
不要担心布局管理器试图保持宽高比,为布局管理器提供足够的信息,以便做出更好的选择,覆盖图像组件的getPreferredSize
和getMinimumSize
方法并提供适当的尺寸提示。在这些图像组件中,我会确保将图像缩放到适当的宽高比并正确渲染