Java 带有 JPanel 的布局管理器
Java LayoutManagers with JPanels
我真的很难创建一个复杂的布局。这是我最终想要的图片:
(来源:fbcdn.net)
我尝试过分而治之,创建小面板并将它们放在其他面板中。起初,我为初始 JFrame 中的主容器面板设计了一个边框布局,并为这些面板中的详细信息设置了一堆 GridBagLayout。当这不起作用时,我想我会尝试全力以赴的 GridBagLayout。现在我的目标是让最上面的一组字符和位置 panels/cards 以正确的纵横比(大约 4:3)显示,并让它们正确调整大小(尽可能保持纵横比) window 已调整大小。当 window 首次出现时,我得到的是每张卡片的超小方形面板。我希望它们以纵横比 (4:3) 开头。
我做的正确吗?
我应该坚持使用所有 GridBagLayouts 吗?
如果不是,您认为哪些布局组合可能有效?
最后,可能也是最重要的一点,他们为什么没有以正确的网格宽度或网格高度开始?
当 window 接近 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);
}
}
首先将每个布局部分分解为单独的需求,然后关注这些需求,例如...
区域#1
好的,基本上,这包含三个主要组件(每个彩色部分都是它自己的面板),可以与 BorderLayout
一起使用
区域#2
所以在这里,你有另外三个areas/panels,因为垂直space的不同要求,我可能会想使用一个GridBagLayout
,这样你就可以定义更多 space 到顶部的两个组件,然后是底部的组件...
区域#3
所以,又是三个主要领域。在这里,我很想再次使用 BorderLayout
。对于单独的容器,我可能会使用 GridBagLayout
或 Rob Camick's WrapLayout
(用于在三个区域中的每个区域内布置图像)
缩放
不要担心布局管理器试图保持纵横比,给布局管理器足够的信息,以便它做出更好的选择,重写 getPreferredSize
和 getMinimumSize
方法图像组件并提供适当的尺寸提示。在这些图像组件中,我会确保图像缩放到适当的宽高比并正确渲染
我真的很难创建一个复杂的布局。这是我最终想要的图片:
(来源:fbcdn.net)
我尝试过分而治之,创建小面板并将它们放在其他面板中。起初,我为初始 JFrame 中的主容器面板设计了一个边框布局,并为这些面板中的详细信息设置了一堆 GridBagLayout。当这不起作用时,我想我会尝试全力以赴的 GridBagLayout。现在我的目标是让最上面的一组字符和位置 panels/cards 以正确的纵横比(大约 4:3)显示,并让它们正确调整大小(尽可能保持纵横比) window 已调整大小。当 window 首次出现时,我得到的是每张卡片的超小方形面板。我希望它们以纵横比 (4:3) 开头。
我做的正确吗?
我应该坚持使用所有 GridBagLayouts 吗?
如果不是,您认为哪些布局组合可能有效?
最后,可能也是最重要的一点,他们为什么没有以正确的网格宽度或网格高度开始?
当 window 接近 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);
}
}
首先将每个布局部分分解为单独的需求,然后关注这些需求,例如...
区域#1
好的,基本上,这包含三个主要组件(每个彩色部分都是它自己的面板),可以与 BorderLayout
区域#2
所以在这里,你有另外三个areas/panels,因为垂直space的不同要求,我可能会想使用一个GridBagLayout
,这样你就可以定义更多 space 到顶部的两个组件,然后是底部的组件...
区域#3
所以,又是三个主要领域。在这里,我很想再次使用 BorderLayout
。对于单独的容器,我可能会使用 GridBagLayout
或 Rob Camick's WrapLayout
(用于在三个区域中的每个区域内布置图像)
缩放
不要担心布局管理器试图保持纵横比,给布局管理器足够的信息,以便它做出更好的选择,重写 getPreferredSize
和 getMinimumSize
方法图像组件并提供适当的尺寸提示。在这些图像组件中,我会确保图像缩放到适当的宽高比并正确渲染