JPanel заполнен кнопками внутри JScrollPane

1

В настоящее время я пытаюсь заполнить JPanel (используя GridLayout) кнопками. Эти кнопки должны быть квадратами с заданной шириной. Программа должна иметь возможность изменять размер игрового поля (кнопки n * m). Проблема в том, что кнопки автоматически растягиваются, чтобы полностью заполнить JScrollpane, полностью игнорируя заданную высоту и ширину. Таким образом, сделать полосы прокрутки ненужными. Вот мой код:

Создание панелей:

panel_game = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane(panel_game);

Попытка изменить размер JPanel: (где x и y - количество кнопок и масштабирование размера)

panel_game.setLayout(new java.awt.GridLayout(x, y));
panel_game.setBounds(panel_game.getX()+5,panel_game.getY()+5,x*zoomlvl-5,y*zoomlvl);
panel_game.setPreferredSize(new Dimension(x*zoomlvl,y*zoomlvl));  

И добавление кнопок: (f - мое игровое поле, 2D-массив) (кнопки - это Arraylist, содержащий мои кнопки)

for(int i=0; i<f.getSize()[0]*f.getSize()[1];i++){
    buttons.add(new JButton());
    buttons.get(i).setSize(zoomlvl, zoomlvl);
    buttons.get(i).setPreferredSize(new Dimension(zoomlvl,zoomlvl));
    panel_game.add(buttons.get(i));
} 

Я понятия не имею, как я могу сказать, что Java перестает изменять размеры моих кнопок и т.д. Автоматически. Помощь будет оценена :)

Теги:
swing
layout-manager

2 ответа

1

GridLayout создан для заполнения контейнера, который использует его с компонентами. Если контейнер с кнопками ограничен размером, то кнопки будут растягиваться или заполняться, чтобы заполнить этот контейнер как можно ближе. Решение может заключаться в том, чтобы развернуть менеджеров компоновки, чтобы этого не произошло, но я не могу дать более конкретные рекомендации, не содержащие больше кода, особенно минимальную примерную программу. Изображения могут помочь.

1

Если вы хотите, чтобы "панель сетки кнопок" не растягивалась, чтобы заполнить всю область области просмотра ScrollPane, вы можете поместить эту панель сетки в другую панель (с FlowLayout).

В общем, вы должны либо

  • не устанавливать предпочтительный размер panel_game OR
  • не устанавливайте предпочтительный размер кнопок

потому как

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

Возможно, это то, чего вы хотите достичь:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class ScrollButtonGrid
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        int x = 5;
        int y = 5;
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(x, y));
        for(int i=0; i<x*y;i++){
            JButton button = new JButton(String.valueOf(i));
            button.setPreferredSize(new Dimension(100,100));
            panel.add(button);
        }
        JPanel container = new JPanel(new FlowLayout(FlowLayout.CENTER, 0,0));
        container.add(panel);
        JScrollPane scrollPane = new JScrollPane(container);
        f.getContentPane().add(scrollPane);

        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}
  • 0
    Ага. 1+ до голосования.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню