Swing: Как мне установить высоту компонента на высоту контейнера? - PullRequest
4 голосов
/ 26 марта 2009

Я хочу, чтобы компонент занимал максимальную высоту контейнера. Например, в коде, который я вставил ниже, я сделал корневой фрейм 800 600. Я хочу установить высоту / ширину только этого кадра (и я не хочу пытаться пикселизировать его дочерние элементы). Если я запускаю это, я вижу плохо выровненный интерфейс.

Во-первых, я хочу, чтобы панель (которая находится внутри корневой рамки) занимала 100% высоты рамки (в данном случае 800px минус небольшое пространство, необходимое для рисования заголовка рамки).

Во-вторых, внутри панели у меня есть дерево и текстовая область. Я хочу, чтобы они оба заняли 100% высоты и позволили дереву занять 30%, а textArea - 70% ширины (если дерево расширяется до 10 уровней, то я в порядке со ScrollPane).

Поймите, что этого проще всего достичь в 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 ]

3 голосов
/ 26 марта 2009

Это использует 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();
    }
}
1 голос
/ 26 марта 2009

Вот еще один подход, использующий 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();
    }
}
1 голос
/ 26 марта 2009

Существует несколько менеджеров макета , которые могли бы выполнить это - GridLayout (сетка 1x1), GridBagLayout, возможно BorderLayout.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...