Как исправить / центрировать GridLayout с помощью стандартных менеджеров компоновки Java? - PullRequest
3 голосов
/ 20 мая 2011

Код ниже представляет проблему.Поскольку у меня есть высота северной и южной панелей, остальная часть уходит на центральную панель с помощью GridLayout.Я думаю, что, поскольку он не может делить оставшиеся пиксели одинаково среди своих строк, он просто оставляет их.Поэтому в приведенном ниже коде мы видим уродливую белую линию над южной панелью.

Мой вопрос здесь такой: Как убедиться, что когда GridLayout не занимает все пространство, оно по крайней мере центрируется?

Обычно я использовал бы TableLayout, и ситуация сортировалась, но так как я писал ответ, я хотел использовать только стандартные менеджеры.Зная, что это было бы очень полезно для меня, спасибо заранее.

Пример:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class AligningButonsTest
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {                   
                JFrame f = new JFrame();
                f.setSize(800, 600);
                double CONSTANT_FACTOR = .1;
                int noOfRows = 5;
                JPanel centerP = new JPanel(new GridLayout(noOfRows,1));

                for(int i = 0; i < noOfRows; i++)
                {   
                    BoxPanel bP = new BoxPanel();
                    centerP.add(bP);
                }
                JPanel contentPane = new JPanel(new BorderLayout());                
                f.setContentPane(contentPane);
                contentPane.add(centerP, BorderLayout.CENTER);
                JPanel southP = new JPanel();
                southP.setBackground(Color.RED.darker());//southP.setOpaque(false);
                southP.setPreferredSize(new Dimension(1, (int)(CONSTANT_FACTOR* f.getHeight())));
                contentPane.add(southP, BorderLayout.SOUTH);
                JPanel northP = new JPanel();
                northP.setBackground(Color.RED.darker());//northP.setOpaque(false);
                northP.setPreferredSize(new Dimension(1, (int)(CONSTANT_FACTOR* f.getHeight())));
                contentPane.add(northP, BorderLayout.NORTH);            
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }   
}

class BoxPanel extends JPanel
{
    public BoxPanel()
    {
        setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.RED));
        setBackground(Color.DARK_GRAY);
    }   
}

Ответы [ 3 ]

4 голосов
/ 20 мая 2011

Как сделать так, чтобы, когда GridLayout не занимал все пространство, он хотя бы центрировался?

JPanel wrapper = new JPanel( new GridBagLayout() );
wrapper.add( centerP );
contentPane.add(wrapper, BorderLayout.CENTER);  
//contentPane.add(centerP, BorderLayout.CENTER); 
3 голосов
/ 20 мая 2011

BoxLayout неплохо справляется с распределением пространства между компонентами, используя Box.createVerticalGlue(). В этом примере используется Box.createVerticalStrut() сверху и снизу. Проставки описаны в Как использовать BoxLayout: Использование невидимых компонентов в качестве наполнителя .

Приложение: BoxTest2 - это вариант, который использует BoxLayout для создания краевых панелей фиксированного размера и вертикального клея для более равномерного распределения пространства. Box.Filler также может использоваться для управления «оставшимся» вертикальным пространством.

/** @see http://stackoverflow.com/questions/6072956 */
public class BoxTest2 {

    private static final int WIDE = 480;
    private static final int HIGH = WIDE / 8;
    private static final int ROWS = 5;
    private static final Box center = new Box(BoxLayout.Y_AXIS);

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                center.setOpaque(true);
                center.setBackground(Color.lightGray);
                center.add(Box.createVerticalGlue());
                center.add(new EdgePanel());
                for (int i = 0; i < ROWS; i++) {
                    center.add(new BoxPanel());
                }
                center.add(new EdgePanel());
                center.add(Box.createVerticalGlue());
                f.add(center, BorderLayout.CENTER);
                f.pack();
                f.setVisible(true);
            }
        });
    }

    private static class EdgePanel extends JPanel {

        public EdgePanel() {
            Dimension d = new Dimension(WIDE, 2 * HIGH / 3);
            setPreferredSize(d);
            setBackground(Color.red.darker());
        }
    }

    private static class BoxPanel extends JPanel {

        public BoxPanel() {
            setPreferredSize(new Dimension(WIDE, HIGH));
            setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.red));
            setBackground(Color.darkGray);
        }
    }
}
2 голосов
/ 20 мая 2011

Не могли бы вы попытаться, возможно, вложить эту центральную панель в BorderLayout.North или даже в FlowLayout.Center.

Под этим я подразумеваю: JPanel holder = new JPanel (new BorderLayout ());holder.add (centerP, BorderLayout.NORTH);contentPane.add (держатель, BorderLayout.CENTER);

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

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