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。对于单独的容器,我可能会使用 GridBagLayoutRob Camick's WrapLayout(用于在三个区域中的每个区域内布置图像)

缩放

不要担心布局管理器试图保持纵横比,给布局管理器足够的信息,以便它做出更好的选择,重写 getPreferredSizegetMinimumSize 方法图像组件并提供适当的尺寸提示。在这些图像组件中,我会确保图像缩放到适当的宽高比并正确渲染