Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JPanels的Java布局管理器_Java_Swing_Jpanel_Layout Manager_Gridbaglayout - Fatal编程技术网

使用JPanels的Java布局管理器

使用JPanels的Java布局管理器,java,swing,jpanel,layout-manager,gridbaglayout,Java,Swing,Jpanel,Layout Manager,Gridbaglayout,我真的很难创建一个复杂的布局。下面是我最后想要的图片: 资料来源: 我试图分而治之,创建小面板,然后将它们放在其他面板中。首先,我为初始JFrame中的主容器面板绘制了一个borderlayout,并为这些窗格中的细节绘制了一系列GridBagLayout。当这不起作用的时候,我想我会尝试我的手在一个全方位的网格布局。现在,我的目标是使顶部的角色和位置面板/卡组以正确的纵横比(大约4:3)显示,并使其正确调整大小,在调整窗口大小时尽可能保持最佳纵横比。当窗口第一次打开时,我得到的是每张卡片上都有

我真的很难创建一个复杂的布局。下面是我最后想要的图片: 资料来源:

我试图分而治之,创建小面板,然后将它们放在其他面板中。首先,我为初始JFrame中的主容器面板绘制了一个borderlayout,并为这些窗格中的细节绘制了一系列GridBagLayout。当这不起作用的时候,我想我会尝试我的手在一个全方位的网格布局。现在,我的目标是使顶部的角色和位置面板/卡组以正确的纵横比(大约4:3)显示,并使其正确调整大小,在调整窗口大小时尽可能保持最佳纵横比。当窗口第一次打开时,我得到的是每张卡片上都有一个超小的方形面板。我希望他们从纵横比4:3开始

我这样做对吗

我应该坚持所有的网格布局吗

如果没有,您认为哪些布局组合可能有效

最后,可能也是最重要的一点,为什么它们一开始就没有正确的网格宽度或网格高度

当窗口接近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);
    }
}

首先,将每个布局部分分解为各自的需求,并关注这些需求,例如

一区 好的,基本上,这有三个主要部分,每个彩色部分是它自己的面板,可以和边框布局一起使用

区域2 在这里,你有另外三个区域/面板,由于对垂直空间的不同要求,我可能会尝试使用GridBagLayout,这将允许你为两个顶部组件定义更多的空间,而不是底部组件

区域3 所以,还是三个主要方面。在这里,我很想再次使用BorderLayout。对于独立容器,我可能会使用GridBagLayout,或者在三个区域中的每个区域中布局图像

缩放比例
不要担心布局管理器试图保持纵横比,为布局管理器提供足够的信息,以便它做出更好的选择,覆盖图像组件的getPreferredSize和getMinimumSize方法,并提供适当的大小调整提示。在这些图像组件中,我会确保将图像缩放到适当的纵横比并正确渲染

我认为您从单独组件开始的想法是正确的开始,但使用GridBagLayout来布置子组件components@MadProgrammer这不是我在提交的代码中所做的吗?当然,但是分解一下,你有4个主容器,其中有两个,有三个子容器,然后你有了实际的内容,依次看每一层,然后关注这些需求individually@MadProgrammer嗯,不明白。。。我有一个带有contentPane的框架,其中包含一个包含6个面板的面板。我想知道为什么当我运行它时,我只得到6个非常小的盒子。我将尝试消除面板中的面板,以查看most子面板是否按预期工作。@MadcharsPanel中确实出现了一些问题,因为仅仅将contentPane设置为包含6个卡片面板的面板并不符合要求。这是分解它的一个极好的视觉表现,也是我的想法。非常感谢。到目前为止,我还没有在程序中放入任何图像,因为我只想正确放置卡片。你是说,当我的位置正确时,按下按钮,当我在这些位置放置实际图像时,解决调整大小的问题,对吗?是的,布局管理器可能会使组件呈方形,例如,让实际组件本身在该空间内渲染图像。好的,最后一个问题。这似乎是一个很好的方式做这样的纸牌游戏。。。i、 e.布置卡片可以放置的位置,然后根据需要创建并放置在这些位置?基本上,它们是同一事物中的一个。卡片可能是某种组件,可以放置在容器中,然后使用卡片/组件的已知系数宽度/高度来确定如何最好地显示图像。对于,我只是想,如果面板的大小与窗口的大小正确,那么我可以创建和放置新卡非常容易地填充一个新面板的背景图像并将其放置在网格上,从而让布局完成所有工作,计算出图像的确切大小。基本上就是这样吗?我想我到了那里就要过桥了。