Как я могу предотвратить слишком сильное сжатие компонентов в LayoutManager? - PullRequest
1 голос
/ 26 августа 2011

Как можно предотвратить сжатие компонентов графического интерфейса при изменении размера в BorderLayout Manager?Можно ли установить минимальный размер, чтобы компоненты не сжимались за его пределы?Кажется, использование setBounds не работает с менеджерами по расположению.

Еще один вопрос: если бы я использовал вложенные панели, можно ли назначить им фиксированные позиции и позволить менеджеру по расположению позаботиться о компонентах внутри этих панелей?Я пытаюсь предотвратить перемещение компонентов графического интерфейса.

Ответы [ 5 ]

5 голосов
/ 26 августа 2011

К сожалению, учитывает ли менеджер макетов минимальный размер, максимальный размер и т. Д. Зависит от реализации менеджера макета.Это приводит к путанице, потому что не все менеджеры по расположению соблюдают их, а BorderLayout не соблюдает эти ограничения.

BoxLayout будет соблюдать эти значения.JComponent.setBounds - это то, что LayoutManager будет использовать для установки границ дочернего элемента, поэтому ваш менеджер компоновки, вероятно, будет перезаписывать все, что вы там поместили.Если вы пытаетесь ограничить, как маленький объект может быть получен, я бы предложил установить минимальный размер для вашего JFrame или JDialog, тогда это не позволит кому-то сделать его слишком маленьким, что приведет к тому, что менеджер раскладок сделает смешные вещи.

Мой первыйДля тех, кто делает Swing, советуем взять TableLayout, потратить 15 минут на его изучение, и большинство ваших проблем с макетом может быть решено.Я не знаю, относится ли это к тому, что вы делаете, но скоро у вас возникнет проблема с макетом, которая этого требует.TableLayout позволяет вам указать, какие объекты растут или уменьшаются, и если окно слишком маленькое, чтобы показать его, оно не меняет их размер меньше предпочтительного размера.

https://www.oracle.com/technetwork/java/tablelayout-141489.html

IЯ не совсем уверен, что вы пытаетесь сделать, чтобы дать лучший совет.

2 голосов
/ 26 августа 2011

Как предотвратить сжатие компонентов графического интерфейса при изменении размера в BorderLayout Manager?Можно ли установить минимальный размер, чтобы компоненты не сжимались за его пределы?

проблема для меня должна состоять в том, чтобы установить MaximumSize для большинства LayoutManager , как я хочу, но Minimum & PreferredSize работает, как я ожидал, просто базовый пример

, заложенный BorderLayout , ожидая область CENTER

import java.awt.*;
import javax.swing.*;

public class CustomComponent extends JFrame {

    private static final long serialVersionUID = 1L;

    public CustomComponent() {
        setTitle("Custom Component Test / BorderLayout");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void display() {
        add(new CustomComponents(), BorderLayout.NORTH);
        add(new CustomComponents(), BorderLayout.CENTER);
        add(new CustomComponents(), BorderLayout.SOUTH);
        add(new CustomComponents(), BorderLayout.EAST);
        pack();
        // enforces the minimum size of both frame and component
        setMinimumSize(getMinimumSize());
        setPreferredSize(getPreferredSize());
        setVisible(true);
    }

    public static void main(String[] args) {
        CustomComponent main = new CustomComponent();
        main.display();
    }
}

class CustomComponents extends JLabel {

    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getMinimumSize() {
        return new Dimension(200, 100);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(300, 200);
    }

    @Override
    public void paintComponent(Graphics g) {
        int margin = 10;
        Dimension dim = getSize();
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
    }
}

, заложенную GridLayout

import java.awt.*;
import javax.swing.*;

public class CustomComponent1 extends JFrame {

    private static final long serialVersionUID = 1L;

    public CustomComponent1() {
        setTitle("Custom Component Test / GridLayout");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void display() {
        setLayout(new GridLayout(0, 1));
        add(new CustomComponents());
        add(new CustomComponents());
        add(new CustomComponents());
        add(new CustomComponents());
        pack();
        // enforces the minimum size of both frame and component
        setMinimumSize(getMinimumSize());
        setPreferredSize(getPreferredSize());
        setVisible(true);
    }

    public static void main(String[] args) {
        CustomComponent1 main = new CustomComponent1();
        main.display();
    }
}

class CustomComponents extends JLabel {

    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getMinimumSize() {
        return new Dimension(200, 100);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(300, 200);
    }

    @Override
    public void paintComponent(Graphics g) {
        int margin = 10;
        Dimension dim = getSize();
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
    }
}

Just one more question: If I used nested panels, is it possible to assign 
them fixed positions and let the layout manager takes care of the components 
inside these panels?

да, я не вижу никаких проблем для наиболее полного GUI, проблема должна состоять в том, чтобы правильно разместить несколько JComponents в GUI, но для этого вам нужно задать реальный вопрос

1 голос
/ 26 августа 2011

Вы можете использовать setMinimumSize, setMaximumSize и setPreferredSize, чтобы контролировать, насколько большими будут ваши компоненты (хотя некоторые менеджеры по расположению обязательно проигнорируют их, если они противоречат требованиям менеджера по расположению).

Не следует использовать setBounds при использовании диспетчера компоновки, поскольку setBounds - это механизм, с помощью которого диспетчер компоновки изменяет размеры компонентов, поэтому любые установленные вами границы будут переопределены диспетчером компоновки.

0 голосов
/ 02 июня 2016

Я искал решение похожей проблемы и нашел здесь очень интересную документацию (она решила мою проблему): http://javadude.com/articles/layouts/#blHow

На самом деле вам просто нужно установить значение preredSize вашего компонента при использовании BorderLayout (см. Ссылку для получения дополнительной информации)

Пример

JFrame jframe = new JFrame("test Borderlayout");
jframe.setLayout(new BorderLayout());

JButton button1 = new JButton("1");
JButton button2 = new JButton("2");
button2.setPreferredSize(new Dimension(200,0));

jframe.add(button1,BorderLayout.CENTER);
jframe.add(button2, BorderLayout.EAST);

jframe.setSize(300, 100);
jframe.setVisible(true);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

В приведенном выше примере button2 не будет уменьшаться (сохраняя свою ширину до 200 пикселей), даже когда вы изменяете размер.

Результат

enter image description here

Результат изменен

enter image description here

0 голосов
/ 26 августа 2011

Может быть, вы могли бы попробовать MigLyout. Это действительно хороший менеджер раскладки.

...