带有JPanel的Java LayoutManagers

时间:2015-01-03 01:10:10

标签: java swing jpanel layout-manager gridbaglayout

我真的在努力创建复杂的布局。这是我最终想要的图片: overpower card game tabletop

我试图划分和征服,创建小面板并将其放入其他面板中。首先,我想到了一个主容器面板的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);
    }
}

1 个答案:

答案 0 :(得分:3)

首先将每个布局部分分解为个别要求,并专注于这些需求,例如......

区域#1

enter image description here

好的,基本上,这有三个主要组成部分(每个彩色部分都是它自己的面板),可以与BorderLayout

一起使用

区域#2

enter image description here

所以在这里,你有另外三个区域/面板,由于对垂直空间的不同要求,我可能想要使用GridBagLayout,这将允许你为两个顶部组件定义更多空间然后最底层的......

区域#3

enter image description here

所以,又是三个主要领域。在这里,我很想再次使用BorderLayout。对于单个容器,我可以使用GridBagLayoutRob Camick's WrapLayout(用于在三个区域中的每个区域内布置图像)

缩放

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