【问题标题】:JPanel taking up more space than it needs. How can I shrink it?JPanel 占用了比它需要的更多的空间。我怎样才能缩小它?
【发布时间】:2015-09-05 12:28:18
【问题描述】:

更新:我因发布非工作代码而受到正当批评。我已经牢记这一点,并正在用一个完整的工作示例更新这篇文章。我也在相应地更新描述:

我有一个非常简单的 java swing GUI,其组件占用的垂直 (Y) 空间看起来与最大 Y 范围组件使用的空间相等,但完全不必要。我尝试使用preferredSize 提示缩小那些不需要那么多垂直空间的组件,但无济于事。

基本布局很简单:有一个主窗口和三个垂直面板。布局是一个简单的 GridLayout(我更愿意保持这种方式,除非有人告诉我我需要的东西不能用 GridLayout 完成)。所有三个面板似乎都占据了相同数量的垂直空间,即使在滑块的情况下,这是巨大的空间浪费。我怎样才能让每个子窗格只使用它们各自需要的空间?即,我希望两个滑块窗口的高度与滑块及其描述所需的一样高。

代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class test {
  public static void main(String[] arg) {
    JFrame mainWindow = new JFrame();
    JSlider slider1 = new JSlider(0,100,50);
    JSlider slider2 = new JSlider(0,100,50);

    JPanel pnlSlider1 = new JPanel();
    pnlSlider1.setLayout(new GridLayout(1,1));  // 1 row, 1 column
    pnlSlider1.add(new JLabel("Description for slider1"));
    pnlSlider1.add(slider1);

    JPanel pnlSlider2 = new JPanel();
    pnlSlider2.setLayout(new GridLayout(1,1));  // 1 row, 1 column
    pnlSlider2.add(new JLabel("Description for slider2"));
    pnlSlider2.add(slider2);

    // label should now be to the left of slider

    String content = "<html>Some rather long winded HTML content</html>";
    JEditorPane ep = new JEditorPane("text/html", content);

    // this is the main window panel
    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(3,1)); // 3 rows, 1 column
    panel.add(ep);
    panel.add(pnlSlider1);
    panel.add(pnlSlider2);

    // tie it all together and display the window
        mainWindow.setPreferredSize(new Dimension(300, 600));
        mainWindow.setLocation(100, 100);
        mainWindow.getContentPane().add(panel);
        mainWindow.pack();
        mainWindow.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        mainWindow.setVisible(true);

  }
}

(删除了关于 30 年来没有看到任何 GUI 编码进步的咆哮,因为这与问题无关,也可能不会在这篇文章中解决)

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。 2) 提供最小尺寸的 ASCII 艺术或简单的 GUI 布局图,如果可调整大小,则具有更大的宽度和高度。
  • “作为一个在 1993 年开始使用 Visual Basic 1.0 进行可视化编程的人,看到这些问题设法持续到 2015 年,我感到很惭愧。这与清洁饮酒不相上下。为地球上的每个人提供水。没有任何借口不普遍存在。” 嗯..“普遍存在”是表达“按照设计使用布局”的一种有趣方式。特别注意 VB在 1993 年,不需要创建跨不同平台和 PLAF(可插拔外观和感觉)强大的 GUI,这要困难一个数量级!

标签: java swing jpanel layout-manager


【解决方案1】:

..components 占用的垂直 (Y) 空间看起来与最大 Y 范围组件使用的空间相等,但完全没有必要。

是的,是GridLayout的设计工作方式。

使用GridBagLayout 或BoxLayout 或GroupLayout 代替,每个都可以执行可变大小(宽度和高度)的单列或单行组件。

【讨论】:

  • Andrew,您是否有机会突出显示对我上面的(修改的)代码的最小代码更改,以使滑块/标签组合之一仅占用使用任何布局所需的垂直空间你建议的经理?我只是无法理解我找到的样本(其中一半不起作用......)
  • 任何机会...... “以最小尺寸提供 ASCII 艺术或简单的 GUI 布局图,如果可调整大小,则具有更大的宽度和高度。” ?
猜你喜欢
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 2011-07-10
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多