【问题标题】:Border layout doesn't work as intended边框布局无法按预期工作
【发布时间】:2016-08-17 00:36:19
【问题描述】:

我想实现下面的布局。

有 6 个面板。顶部的 4 个按钮是一个面板,图像右侧的 3 个按钮也是一个面板。除了这两个之外,还有 4 个其他面板,如边框所示。我尝试了以下代码,但以分散的方式显示所有内容。

mainPanel.add(topToolBarPanel,BorderLayout.PAGE_START);
mainPanel.add(lefsideToolBarPanel,BorderLayout.LINE_START);
mainPanel.add(descriptionPanel,BorderLayout.LEFT);
mainPanel.add(mapPanel,BorderLayout.CENTER);
mainPanel.add(propertiesPanel,BorderLayout.EAST);
mainPanel.add(tablePanel,BorderLayout.PAGE_END);

如何实现如图所示的设计?我需要将所有面板安排在该 mainPanel 内。我不能使用空布局。请指教。

在垃圾神回答之后:

    JPanel gridPanel =  new JPanel(new GridLayout(1, 0));
    gridPanel.add(jInternalFrame1);
    gridPanel.add(descriptionPanel);
    mainPanel.add(gridPanel, BorderLayout.LINE_START);
    mainPanel.add(topToolBarPanel,BorderLayout.PAGE_START);
    mainPanel.add(tablePanel,BorderLayout.PAGE_END);
    mainPanel.add(mapPanel,BorderLayout.CENTER);
    mainPanel.add(PropertiesPanel,BorderLayout.LINE_END);

我得到了什么:

【问题讨论】:

  • 您可以将 2 个东西放在 LEFT(EAST) 任何将地图面板包裹在另一个面板上,您将描述面板放在左侧或使用填充整个框架的网格窗格
  • 当我把两件东西放在一边时,它会把它们放在另一件上。网格窗格也不是这样排列的
  • 你不明白...
  • 你能用代码给我答案吗?非常感谢:)
  • 这是给你的图片i.gyazo.com/3f0c82111277b5f459b5a425999873e4.png 是的,我用油漆做的,这就是为什么它很丑

标签: java swing layout netbeans jpanel


【解决方案1】:

lefsideToolBarPaneldescriptionPanel 添加到具有GridLayout 的面板;将新面板添加到BorderLayout

Panel p  new Panel(new GridLayout(1, 0));
p.add(lefsideToolBarPanel);
p.add(descriptionPanel);
//mainPanel.add(lefsideToolBarPanel, BorderLayout.LINE_START);
//mainPanel.add(descriptionPanel, BorderLayout.LEFT);
mainPanel.add(p, BorderLayout.LINE_START);

没有BorderLayout.LEFT。另见A Visual Guide to Layout Managers

附录:您更新的问题显示了topToolBarPanel 的元素,应将其添加到PAGE_START,而不是LINE_START

//mainPanel.add(topToolBarPanel,BorderLayout.LINE_START);
mainPanel.add(topToolBarPanel,BorderLayout. PAGE_START);

propertiesPanel 的宽度和tablePanel 的高度需要增加。我用setSize()

对于propertiesPanel,您可以覆盖getPreferredSize(),如here 所述。对于tablePanel,覆盖getPreferredScrollableViewportSize() 以自定义表格的封闭JScrollPane 的大小,对于example

【讨论】:

  • 它也不行。我用我按照你的建议尝试的代码和我得到的输出编辑了这个问题:(
  • 我再次编辑了问题。这一次接近了。但仍然不是完全预期的设计。 :(
  • GridLayout(3, 0) 表示“行和尽可能多的列;” GridLayout(1, 0) 表示“一行 行和尽可能多的列”。请参阅nested layouts 了解更多信息。
  • 我用我得到的图像再次编辑了这个问题。现在位置是准确的。但是需要增加属性面板的宽度和tablePanel 的高度。我使用了 setSize 但它没有任何效果。是不是不能增加布局内的高宽?
【解决方案2】:

我建议使用 JLabel 作为您的“布局”,以使用 setBounds(x, y, width, height) 精确定位您的对象。它看起来类似于:

JButton button = new JButton("Text or Image");
JLabel backgr = new JLabel();
JFrame frame = new JFrame("JLabel as Layout");

button.setBounds(100, 200, 340, 40);

backgr.add(button);

frame.add(backgr);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 600);
frame.setLocation(40, 40);
frame.validate();
frame.setVisible(true);

我知道这对你来说只是一个简单的例子,但我认为它应该用来解释......所以只需将所有内容添加到 backgr JLabeland 上,你就可以使用了。 Quick and dirty example but the a way to go

【讨论】:

  • 请不要宣传空布局。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多