代码之家  ›  专栏  ›  技术社区  ›  Kannan Ekanath

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

  •  4
  • Kannan Ekanath  · 技术社区  · 17 年前

    我想制作一个占据容器最大可用高度的组件。例如,在下面粘贴的代码中,我将根框架设置为800600。我只想设置该帧的高度/宽度(我不想尝试对其子帧进行像素化)。如果我运行这个,我会看到一个排列不齐的UI。

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

    其次,在面板内部,我有一个树和文本区域。我想他们都采取100%的高度,让树采取30%和textArea采取70%的宽度(如果树扩展到10级,那么我同意滚动窗格)。

    请理解,这在HTML中最容易实现。只要说高度=100%,宽度为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();
        }
    }
    
    3 回复  |  直到 17 年前
        1
  •  3
  •   KitsuneYMG    17 年前

    这使用GridBagLayout来完成某种您想要的操作。您可以使用组件的setMinimumSize和setPreferredSize。

    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();
        }
    }
    
        2
  •  1
  •   Michael Brewer-Davis    17 年前

    有许多 layout managers 这将实现这一点——GridLayout(1x1网格),GridBagLayout,也许是BorderLayout。

        3
  •  1
  •   KitsuneYMG    17 年前

    下面是使用SpringLayout的另一种方法。我无法让Spring.width和Spring.height工作,所以我使用了更详细的方式

    import java.awt.BorderLayout;
    import java.awt.Color;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTree;
    import javax.swing.Spring;
    import javax.swing.SpringLayout;
    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);        
            SpringLayout layout = new SpringLayout();
            JTree env = getEnvironmentTree();
            env.expandRow(0);
            JPanel contentPane = new JPanel(layout);
            contentPane.setLayout(layout);
            JScrollPane treePane = new JScrollPane(env);
            JTextArea area = new JTextArea("Some contents");
            contentPane.add(treePane);
            contentPane.add(area);        
            setLayout(new BorderLayout());
            add(contentPane);
            setSize(800, 600);
    
            SpringLayout.Constraints  cons;
            cons = layout.getConstraints(treePane);
            cons.setX(Spring.constant(0));
            cons.setY(Spring.constant(0));
            cons.setWidth(Spring.scale(layout.getConstraint(SpringLayout.EAST, contentPane), .7f));
            cons.setHeight(layout.getConstraint(SpringLayout.SOUTH, contentPane));
    
            cons = layout.getConstraints(area);
            cons.setX(layout.getConstraint(SpringLayout.EAST, treePane));
            cons.setY(Spring.constant(0));
            cons.setWidth(Spring.scale(layout.getConstraint(SpringLayout.EAST, contentPane), .3f));
            cons.setHeight(layout.getConstraint(SpringLayout.SOUTH, contentPane));
            setPreferredSize(getSize());
            setLocationRelativeTo(null);
            pack();
            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();
        }
    }