java - 使组件仅占用特定部分的空间(如 2/3 或 9/10)

标签 java swing layout

对我来说,使用布局会导致很多挫败感,以至于我最终使用了绝对布局,然后手动缩放组件。

假设我有一个 TextArea,我希望它占据屏幕的 2/3。 我真正想要的是拥有一个包含 3 行的 GridLayout,并强制 TextArea 一次获取其中的两行。

例如:

  • 第 1 行(被第一个 textArea 占用)
  • 第 2 行(被同一文本区域占用)
  • 第 3 行(被按钮占用)

这是一张使用 Gridbag 布局的图片(修改自 java tutoria l)。我希望绿色区域由单个组件占据。

GridBagLayout

这只是一种表达我自己的方式,我确信还有其他方式(或布局)可以做到这一点。但是请注意,我还想对其他特定比例执行此操作,例如 9/10。

那会节省很多时间。谢谢!

最佳答案

一般来说,您不应该使用绝对百分比,尤其是单个组件。您应该让组件以其首选大小显示。所以你的例子真的没有任何意义。当您有一个带有文本区域和按钮的表单时。然后大小的变化应该影响文本区域而不是按钮。然后向文本区域添加一个滚动 Pane ,这样滚动条就会根据需要出现或消失。

但是,如果出于某种原因您确实需要在面板级别使用绝对百分比,您可以使用如下代码:

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

public class GridBagSSCCE extends JPanel
{
    JPanel red;
    JPanel green;

    public GridBagSSCCE()
    {
        setLayout( new GridBagLayout() );
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.VERTICAL;

        red = new JPanel();
        red.setBackground( Color.RED );
        red.setPreferredSize( new Dimension(300, 10) );
        gbc.weighty = 0.1;
        add(red, gbc);

        green = new JPanel();
        green.setBackground( Color.GREEN );
        green.setPreferredSize( new Dimension(300, 90) );
        gbc.gridy = 1;
        gbc.weighty = 0.9;
        add(green, gbc);

        JPanel buttons = new JPanel();
        buttons.add( new JButton("Ok") );
        buttons.add( new JButton("Cancel") );
        buttons.setAlignmentX(JPanel.RIGHT_ALIGNMENT);
        gbc.gridy = 2;
        gbc.weighty = 0.0;
        gbc.anchor = GridBagConstraints.LINE_END;
        add(buttons, gbc);

        addComponentListener( new ComponentAdapter()
        {
            public void componentResized(ComponentEvent e)
            {
                System.out.println(red.getSize() + " : " + green.getSize());
            }
        });
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("GridBagSSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new GridBagSSCCE() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

上述代码的关键是从您想要的 (10/90) 比例的首选大小开始,并以相同的比例设置组件的权重。

如果需要,您还可以查看 Relative Layout这是专门为此目的而写的。

编辑:

GridBagLayout 不以百分比显示组件。仅仅因为你有两行并不意味着每一行都是 50%。每行的高度取决于每行中添加的每个组件的高度。

首先,您决定要在文本区域中显示的首选数据量。对于两行,你会使用类似的东西:

JTextArea textArea = new JTextArea(2, 40);
JScrollPane scrollPane = new JScrollPane( textArea );

然后创建一个带有按钮的面板。

可能会发现,一个 2 行的文本区域与一个带有按钮的面板的大小大致相同,因为面板在组件上方和下方添加了一个垂直间隙,并且按钮具有相对较大的边框,但这只是巧合.但是你不应该强制文本区域超过一半。让布局管理器和 pack() 方法完成它们的工作。

现在您需要决定当框架尺寸增加时会发生什么,因为这将决定父容器的布局管理器。在这种情况下,我可能会使用 BorderLayout,因此我会使用如下代码:

frame.add(scrollPane, BorderLayout.CENTER);
frame.add(buttonPanel, BorderLayout.SOUTH);
frame.pack();

您不关心文本区域是否占框架的一半。 pack 方法根据每个组件的首选大小确定它们的相对大小。如果框架增加,文本区域将获得更多空间。

关于java - 使组件仅占用特定部分的空间(如 2/3 或 9/10),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6966601/

相关文章:

java - MVC模式线条困惑

Java 自己的组件通过拖放进行视觉连接

android - 如何允许 EditText 扩展推开对等控件

java - 你如何在一行中挂起Java中的线程?

java - 堆 : Survivor Space

Java GUI 创建框架

java - 如何在java中对齐JPanel

Android:如何从设计中计算 dpi?

android - 布局高度应该是布局宽度的函数

java - 客户端/服务器只读取一条消息?