В настоящее время я пытаюсь заполнить 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 перестает изменять размеры моих кнопок и т.д. Автоматически. Помощь будет оценена :)
GridLayout создан для заполнения контейнера, который использует его с компонентами. Если контейнер с кнопками ограничен размером, то кнопки будут растягиваться или заполняться, чтобы заполнить этот контейнер как можно ближе. Решение может заключаться в том, чтобы развернуть менеджеров компоновки, чтобы этого не произошло, но я не могу дать более конкретные рекомендации, не содержащие больше кода, особенно минимальную примерную программу. Изображения могут помочь.
Если вы хотите, чтобы "панель сетки кнопок" не растягивалась, чтобы заполнить всю область области просмотра 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);
}
}