当前位置: 首页 > 面试题库 >

如何使用GridBagConstraints创建布局?

郗河
2023-03-14
问题内容

我想这样布局我的JPane:

-------
|     |
|     |
|     |
-------
|     |
-------

这样,顶部比底部更大/更小(顶部由另一个JPanel组成,并使用Graphics对象显示图像,而底部也由另一个JPanel组成,但使用Graphics对象绘制一些线和文字)。

我听说最好的方法是使用GridBagLayout和GridBagConstraints。

我试图找出GridBagConstraints的适当属性,但遇到了一些困难。这是我到目前为止所拥有的…

对于顶部,我有:

gridx = 0
gridy = 0
weighty = 1.0; // expand downwards, because the bottom should never expand in the Y direction
fill = GridBagConstraints.BOTH

对于底部,我有:

gridx = 0
gridy = 1
fill = GridBagConstraints.HORIZONTAL
anchor = GridBagConstraints.PAGE_END

不幸的是,所有结果都是一个大的灰色矩形出现(我的应用程序有白色背景)-没有图像加载,没有行/文本出现。

我该怎么办?我该怎么调整?

我已经阅读了一些教程,但看起来确实很令人困惑,我在第一个应用程序中就可以使用它,但是现在当我尝试执行此操作时,对我来说似乎不起作用。


问题答案:

通常,对于网格布袋布局

  • 如果要使用组件比例,则必须为其比例方向赋予一个权重,并且为此方向设置的任何大小(宽度/高度)都将被布局管理器忽略。

  • 如果您不希望组件缩放,则必须定义组件的大小(如果需要,可以在Java文档中深入探讨此主题)。就底部面板而言,至少需要给其一个首选高度。

这可以按您的期望

pnlTop.setBackground(Color.WHITE);
pnlBottom.setBackground(Color.BLUE);

// Because you don't want the bottom panel scale, you need to give it a height.
// Because you want the bottom panel scale x, you can give it any width as the
// layout manager will ignore it.
pnlBottom.setPreferredSize(new Dimension(1, 20));


getContentPane().setLayout(new GridBagLayout());
GridBagConstraints cst = new GridBagConstraints();
cst.fill = GridBagConstraints.BOTH;
cst.gridx = 0;
cst.gridy = 0;
cst.weightx = 1.0; // --> You miss this for the top panel
cst.weighty = 1.0;
getContentPane().add(pnlTop, cst);

cst = new GridBagConstraints();
cst.fill = GridBagConstraints.HORIZONTAL;
cst.gridx = 0;
cst.gridy = 1;
cst.weightx = 1.0; // You miss this for the bottom panel
cst.weighty = 0.0;
getContentPane().add(pnlBottom, cst);

更进一步,如果您想使用gridbag布局,建议您尝试使用painless-
gridbag库http://code.google.com/p/painless-
gridbag/
(我是该库的作者)。它不能为您解决此问题(因为您的问题涉及在网格袋布局中管理组件的大小),但可以节省大量键入时间,并使代码更易于维护

pnlBottom.setPreferredSize(new Dimension(1, 20));

PainlessGridBag gbl = new PainlessGridBag(getContentPane(), false);
gbl.row().cell(pnlTop).fillXY();
gbl.row().cell(pnlBottom).fillX();
gbl.done();


 类似资料:
  • 问题内容: 在redis文档中,我发现可以通过SETNX实现基本锁: http://redis.io/commands/setnx C4发送SETNX lock.foo以获取锁 崩溃的客户端C3仍然保留它,因此Redis将以0答复C4。 C4发送GET lock.foo以检查锁是否过期。如果不是,它将hibernate一段时间并从头开始重试。 相反,如果由于lock.foo上的Unix时间早于当前

  • 我想要一个3xN布局在我的移动React Native应用程序,所以像这样的东西: 整个布局,垂直的,将在滚动视图,这样即使它加载的项目超过一个屏幕可以显示,它可以正确地显示它的整体。

  • 我有一个软件,可以从文本文件创建描述,并将其转换为PDF文档。文本文件中的每一行都被转换为fo中的,这听起来是错误的,但我现在无法更改。我的文件包含1到3页A4纸。 我现在需要做的是在现有文本下方添加一个宽度约为8厘米的图形。它应该是左对齐的。在它旁边,我想放置一个带有(长)描述的文本块。 我查看了FO的几个文档并提出了这个: 这似乎是我想要的(当然经过一些微调),但不幸的是,FOP还不支持<co

  • 本文向大家介绍如何使用CSS创建自适应Zig zag(交替)布局?,包括了如何使用CSS创建自适应Zig zag(交替)布局?的使用技巧和注意事项,需要的朋友参考一下 要使用CSS创建响应之字形布局,代码如下- 示例 输出结果 上面的代码将产生以下输出- 在调整屏幕大小时-

  • 如何为我的所有页面创建基本模板? 我试着在所有可用的页面上做一个RadSideDrawer。(除了一些特定的页面,如登录/注册等)。 目前,我在所有页面上复制并通过我的菜单。正确的处理方式是什么?

  • 问题内容: 我是TestNG和Selenium Webdriver的新手,并尝试使用eclipse创建testng.xml。 在www上进行了一些研究,并了解可以通过右键单击Java类>> TestNG >>转换为TestNG来创建此文件。 但是,此转换重构向导未打开。 如果Java类已经包含@Test批注(!?),则此向导是否将无法打开 您能帮我使用eclipse创建testng.xml吗? (