Swing: How do I set a component height to the container's height?

前端 未结 3 1255
隐瞒了意图╮
隐瞒了意图╮ 2021-01-19 21:30

I want to make a component to occupy the maximumAvailableHeight of the Container. In the code that I have pasted below for example, I have made the root frame to be 800,600.

相关标签:
3条回答
  • 2021-01-19 22:10

    Here is another approach using SpringLayout. I couldn't get Spring.width and Spring.height to work so I used a more verbose way

    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();
        }
    }
    
    0 讨论(0)
  • 2021-01-19 22:11

    There are a number of layout managers that would accomplish this--GridLayout (1x1 grid), GridBagLayout, perhaps BorderLayout.

    0 讨论(0)
  • 2021-01-19 22:27

    This uses GridBagLayout to do sort of what you want. You might play around with setMinimumSize and setPreferedSize of your components.

    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();
        }
    }
    
    0 讨论(0)
提交回复
热议问题