java - Swing:如何将组件高度设置为容器的高度?

标签 java swing

我想让一个组件占据容器的maximumAvailableHeight。例如,在我粘贴在下面的代码中,我将根帧设置为 800,600。我只想设置那个框架的高度/宽度(我不想尝试像素化它的 child )。如果我运行它,我会看到一个排列不当的 UI。

首先,我想要一个面板(位于根框架内)占据框架的 100% 高度(在本例中为 800px 减去绘制框架标题所需的小空间)。

其次,在面板内我有一个树和文本区域。我希望它们都占 100% 的高度,让树占 30%,textArea 占 70% 的宽度(如果树扩展到 10 级,那么我可以使用 ScrollPane)。

了解这在 HTML 中最容易实现。只要说 height=100% 和 width 为 30% 等等,我们就完成了。有人知道这是否可以在 Swing 中完成吗? (我可以通过设置像素高度和布局管理器来实现这一点,但我正在寻找设置百分比高度和宽度的最干净的解决方案。)

package com.ekanathk.logger.gui;

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;

public class TestFrame extends JFrame {
    public TestFrame() {
        super("Top Frame");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        JTree env = getEnvironmentTree();
        env.expandRow(0);
        panel.add(new JScrollPane(env));
        panel.add(new JTextArea("Some contents"));
        getContentPane().add(panel);
        setSize(800, 600);
        SwingUtil.centerComponentOnScreen(this);
        setVisible(true);
    }

    private JTree getEnvironmentTree() {
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        JTree tree = new JTree(root);
        DefaultMutableTreeNode one = new DefaultMutableTreeNode("One");
        root.add(one);
        one.add(new DefaultMutableTreeNode("under one.1"));
        one.add(new DefaultMutableTreeNode("under one.2"));
        root.add(new DefaultMutableTreeNode("two"));
        root.add(new DefaultMutableTreeNode("three"));
        return tree;
    }

    public static void main(String[] args) {
        new TestFrame();
    }
}

最佳答案

这使用 GridBagLayout 来做你想做的事情。您可能会尝试使用组件的 setMinimumSize 和 setPreferedSize。

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;

public class TestFrame extends JFrame {
    private static final long serialVersionUID = 1L;

    public TestFrame()  {
        super("Top Frame");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new GridBagLayout());

        JTree env = getEnvironmentTree();
        env.expandRow(0);

        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH;
        c.weightx=.7;
        c.weighty=1;

        c.gridx=0;
        c.gridy=0;
        c.gridheight=1;
        c.gridwidth=7;
        panel.add(new JScrollPane(env),c);

        c.weightx=.3;
        c.gridx=7;
        c.gridy=0;
        c.gridheight=1;
        c.gridwidth=GridBagConstraints.REMAINDER;
        panel.add(new JTextArea("Some contents"),c);

        add(panel);
        setSize(800, 600);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private JTree getEnvironmentTree() {
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        JTree tree = new JTree(root);
        DefaultMutableTreeNode one = new DefaultMutableTreeNode("One");
        root.add(one);
        one.add(new DefaultMutableTreeNode("under one.1"));
        one.add(new DefaultMutableTreeNode("under one.2"));
        root.add(new DefaultMutableTreeNode("two"));
        root.add(new DefaultMutableTreeNode("three"));
        return tree;
    }

    public static void main(String[] args) {
        new TestFrame();
    }
}

关于java - Swing:如何将组件高度设置为容器的高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/686882/

相关文章:

Java Swing 匿名操作

java - Java中如何从循环中取出变量?

java - 为什么给定的代码抛出异常(Jsoup)

java - 针对 iOS 开发者的 Android 指南提示?

java - 如何为 Java 刷新按钮图像图标

java - 如何使 JButton 在以图像作为背景的 JPanel 上可见

java - 我们可以对不同包名称中的所有 webServies 使用相同的 @HandlerChain 吗?

java - 找不到在 Eclipse 中导入的外部 jar 的类

java - JFrame 与在后台运行的图像/程序具有相同的形状

java - 单击按钮后显示一个面板,在同一帧中单击第二个按钮时显示另一个面板