Нестабильный Miglayout - сделать два растущих столбца одинакового размера - PullRequest
0 голосов
/ 09 мая 2018

У меня есть этот простой MigLayout:

enter image description here

Два последних компонента (JScrollPanes) должны иметь одинаковую ширину.Но на самом деле, если я изменю размеры окна, они беспорядочно прыгают.Можно ли сделать их ширину равной?Как еще можно расположить компоненты, чтобы они выглядели симметрично?

1 Ответ

0 голосов
/ 09 мая 2018

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

Я знаю, что этот вопрос касается MigLayout, но я предпочел показать, что нет необходимости использовать это для этой простой ситуации. Библиотека MIG богата и имеет несколько полезных компонентов, которые могут упростить вашу жизнь, но когда дело доходит до макетов, я предпочитаю чистую Java.

Выборка макета с использованием чистых BorderLayout и GridLayout:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

public class TestMain {
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        JFrame f = new JFrame();
        f.setBounds(50, 50, 500, 400);
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.add(createSpacerPanel(10, 10), BorderLayout.NORTH);
        f.add(createSpacerPanel(10, 10), BorderLayout.SOUTH);
        f.add(createSpacerPanel(10, 10), BorderLayout.EAST);
        f.add(createSpacerPanel(10, 10), BorderLayout.WEST);
        f.add(new MainPanel());
        f.setVisible(true);
    }

    private static JPanel createSpacerPanel(int width, int height){
        JPanel spacer = new JPanel();
        spacer.setPreferredSize(new Dimension(width, height));
        return spacer;
    }
}

class MainPanel extends JPanel{

    public MainPanel() {
        init();
    }

    private void init() {
        JPanel northPanel = new JPanel(new BorderLayout(10, 10));
        northPanel.setPreferredSize(new Dimension(100, 60));
        northPanel.add(new JLabel("Class Expression: "), BorderLayout.NORTH);
        JTextArea classExpressionTextArea = new JTextArea();    
        classExpressionTextArea.setSize(10, 40);
        northPanel.add(new JScrollPane(classExpressionTextArea), BorderLayout.CENTER);
        JButton calculateButton = new JButton("Calculate");
        northPanel.add(calculateButton, BorderLayout.EAST);

        JPanel definitionPanel = new JPanel(new BorderLayout(10,10));       
        definitionPanel.add(new JLabel("Definitions Found: "), BorderLayout.NORTH);
        JTextArea definitionsTextArea = new JTextArea();        
        definitionPanel.add(new JScrollPane(definitionsTextArea), BorderLayout.CENTER);

        JPanel signaturePanel = new JPanel(new BorderLayout(10,10));    
        signaturePanel.add(new JLabel("Target Signature: "), BorderLayout.NORTH);
        JTextArea targetTextArea = new JTextArea();
        signaturePanel.add(new JScrollPane(targetTextArea), BorderLayout.CENTER);

        GridLayout gridLayout = new GridLayout(1,1,10,10);
        JPanel centerPanel = new JPanel(gridLayout);
        centerPanel.add(definitionPanel);
        centerPanel.add(signaturePanel);

        setLayout(new BorderLayout(10,10));
        add(northPanel, BorderLayout.NORTH);
        add(centerPanel, BorderLayout.CENTER);      
    }
}

И вывод полностью изменяемого размера:

enter image description here

Того же можно достичь, используя GridBagLayout, что аналогично MigLayout в смысле мышления о компоновке, позиционировании и охвате компонентов над ячейками сетки.

Надеюсь, это будет полезно.

...