【问题标题】:Swing: How do I set a component height to the container's height?Swing:如何将组件高度设置为容器的高度?
【发布时间】:2009-03-26 17:57:18
【问题描述】:

我想让一个组件占据Container的maximumAvailableHeight。例如,在下面粘贴的代码中,我将根帧设置为 800,600。我只想设置该帧的高度/宽度(我不想尝试对其子项进行像素化)。如果我运行它,我会看到一个对齐错误的 UI。

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

其次,在面板内我有一个树和文本区域。我希望它们都占据 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();
    }
}

【问题讨论】:

    标签: java swing


    【解决方案1】:

    这使用 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();
        }
    }
    

    【讨论】:

    • 我确实使用了这个解决方案,而且开始时效果很好。但在我的实际应用程序中,右窗格不仅仅是一个文本区域(它实际上是一个 JTabbedPane,可能有 10 多个选项卡)。当树中的文本很长时,对齐就搞砸了(我认为我必须 setMaximumSize,这是我不想要的)。我用过
    • TableLayout 符合java.sun.com/products/jfc/tsc/articles/tablelayout 中的规定,并且代码的工作方式非常棒 :) panel.setLayout(new TableLayout(new double[][]{{0.3, 0.7}, {TableLayout.FILL}} )); panel.add(p1, "0,0"); panel.add(p2, "1,0");
    • 您尝试过我在下面(当前)发布的弹簧布局解决方案吗?它的优点是它似乎比这个更好地调整大小。
    • 完美运行.. 节省我的时间
    【解决方案2】:

    有许多layout managers 可以实现这一点——GridLayout(1x1 网格)、GridBagLayout,也许还有 BorderLayout。

    【讨论】:

      【解决方案3】:

      这是使用 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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-18
        • 1970-01-01
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多