выравнивание в разгаре - PullRequest
       1

выравнивание в разгаре

1 голос
/ 20 января 2011
public class Some extends JFrame{
    public Some(){
        //Create panel for the buttons and set Grid Layout
        JPanel p1 = new JPanel();
        p1.setLayout(new GridLayout(20, 20));

        //Add buttons to the panel
        for(int i = 1; i <= 20; i++){
            for(int j = 1; j <= 20; j++){
                JButton newButton = new JButton();
                newButton.setSize(10,10);
                newButton.setBackground(Color.WHITE);
                p1.add(newButton);
            }
        }

        //add contents into the frame
        add(p1);
    }

мой вопрос: как я могу заставить мою панель p1 растягиваться по всему кадру?

Отредактировано в основном я использую метод

frame.setSize(400, 400);

это может быть проблемой?

Ответы [ 5 ]

1 голос
/ 20 января 2011

Самый простой способ - установить макет на BorderLayout, а затем вставить панель в центр.

public class Some extends JFrame{
   public Some(){
    //Create panel for the buttons and set Grid Layout
    JPanel p1 = new JPanel();
    p1.setLayout(new GridLayout(20, 20));

    //Add buttons to the panel
    for(int i = 1; i <= 20; i++){
        for(int j = 1; j <= 20; j++){
            JButton newButton = new JButton();
            newButton.setSize(10,10);
            newButton.setBackground(Color.WHITE);
            p1.add(newButton);
        }
    }

    //add contents into the frame
    this.setLayout(new BorderLayout());
    add(p1, BorderLayout.CENTER);
}
0 голосов
/ 20 января 2011

Проблема в том, что GridLayout гарантирует, что все компоненты имеют одинаковый размер.Это означает, что ширина и высота панели (p1) должны быть кратны 20, чтобы компоненты достигли края.Вы можете либо убедиться, что панель имеет фиксированный размер, например так (в конце конструктора):

setResizable(false);
p1.setPreferredSize(new Dimension(400, 400));
add(p1);
pack();

Ваш вызов frame.setSize (...) не сделал панель 400400, потому что размер кадра включает в себя границу вокруг рамки.

В качестве альтернативы вы можете использовать собственный менеджер макета, который не гарантирует, что все кнопки имеют одинаковый размер.Этот пример заставит кнопки заполнить всю область панели:

private static class FullyJustifiedGridLayout implements LayoutManager {
    private final int rows;
    private final int columns;

    public FullyJustifiedGridLayout(int rows, int columns) {
        this.rows = rows;
        this.columns = columns;
    }

    @Override
    public void layoutContainer(Container parent) {
        synchronized (parent.getTreeLock()) {
            double clientWidth = parent.getWidth() - parent.getInsets().left - parent.getInsets().right; 
            double clientHeight = parent.getHeight() - parent.getInsets().top - parent.getInsets().bottom; 
            for (int i = 0; i < parent.getComponents().length; i++) {
                Component component = parent.getComponents()[i];
                int row = i / rows, column = i % columns;
                int x = (int)(clientWidth * column / columns);
                int y = (int)(clientHeight * row / rows);
                int nextX = (int)(clientWidth * (column + 1) / columns);
                int nextY = (int)(clientHeight * (row + 1) / rows);
                component.setBounds(x, y, nextX - x, nextY - y);
            }
        }
    }

    @Override
    public Dimension minimumLayoutSize(Container parent) {
        return new Dimension(20 * 10, 20 * 10);
    }

    @Override
    public Dimension preferredLayoutSize(Container parent) {
        return new Dimension(20 * 20, 20 * 20);
    }

    @Override
    public void removeLayoutComponent(Component comp) {
    }

    @Override
    public void addLayoutComponent(String name, Component comp) {
    }
}

Просто замените ваш вызов на новый GridLayout (20, 20) новым FullyJustifiedGridLayout (20, 20).

Кроме того, когда вы используете менеджеры компоновки, нет необходимости вызывать setSize, setLocation или setBounds для компонентов - они вызываются менеджером компоновки, когда он размещает панель.Если вы хотите изменить размеры компонентов, используйте вместо них setPreferredSize.

0 голосов
/ 20 января 2011

Две точки:

[1] В JFrame вы добавляете материал в его getContentPane (), контейнер.

[2] Либо (a) setPreferredSize () JButton'sиспользуйте новый Dimension ()) и pack () JFrame или (b) setSize (Dimension) для JFrame и дайте LayoutManager изменить размер JButtons.Используя ваш подход (а), код выглядит следующим образом (я добавил main () для его компиляции / запуска)

Извините, я не могу заставить форматирование / отступы работать должным образом: (

import java.awt.*;

import javax.swing.*;

public class Some extends JFrame{     

    public Some(){         
        //Create panel for the buttons and set Grid Layout         
        JPanel p1 = new JPanel();         

        p1.setLayout(new GridLayout(20, 20));  //Add buttons to the panel

        for(int i = 1; i <= 20; i++){
            for(int j = 1; j <= 20; j++){
                JButton newButton = new JButton();
                newButton.setPreferredSize(new Dimension (10,10));
                newButton.setBackground(Color.WHITE);
                p1.add(newButton);
        }}

        //add contents into the frame
        getContentPane().add(p1);

        pack();
    } 

    public static void main (String[] args) {
        new Some().setVisible(true);
    }
}
0 голосов
/ 20 января 2011

newButton.setSize (10,10);

frame.setSize (400, 400);Может ли это быть проблемой?

Вы пытаетесь установить размер, равный 10 пикселям, и у вас есть 20 компонентов, так почему бы вы выбрали размер 400?200 будет более точным предположением, хотя это все равно будет неправильно (потому что вам нужно разрешить пространство для границ кадра).

Вне цикла вы должны создать переменную:

Dimension preferred = new Dimension(10, 10);

Тогда внутри вашей петли вы должны использовать:

newButton.setPreferredSize( preferred );

Затем вы можете использовать:

//frame.setSize(400, 400);
frame.setResizeable(false);
frame.pack();

Рамка будет иметь размер, соответствующий нужному размеру, чтобы избежатьпространство.

0 голосов
/ 20 января 2011

Это в значительной степени зависит от менеджера компоновки фрейма, но в целом вы должны установить максимальный размер панели (Integer.MAX_VALUE, Integer.MAX_VALUE), чтобы позволить ей растягиваться:

p1.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE))

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