Создание массива кнопок на панели - Java
Формулировка задачи:
Хотелось бы создать массив кнопок на форме (панели). Есть некий код с GridBagLayout
Со строки 20 хотелось бы изменить код, чтобы панелька могла быть действительно гибкой, а не только прямоугольной.
Для того, чтобы посмотреть более по́лно код, со всеми классами, посетите GitHub страницу.
// конструктор
public ColorChoosing(ColorsList colorsList) {
// buttons — массив кнопок
ArrayList<JButton> buttons = new ArrayList<>();
// btnColors — массив цветов для кнопок (лежит в отдельном классе, передаётся через экземпляр)
ArrayList<Color> btnColors = colorsList.getColors();
// Для каждой кнопки задаётся её цвет
for (int i = 0; i < btnColors.size(); i++) {
// крайне странная реализация (сам делал) для лямбда выражений
final int m = i;
// в массив добавляется кнопка
buttons.add(new JButton());
// для каждой кнопки задаётся цвет из коллекции цветов
buttons.get(i).setBackground(btnColors.get(i));
// каждой кнопке задаётся ActionListener для добавления её цвета в другую коллекцию
buttons.get(i).addActionListener(event -> addColor(btnColors.get(m)));
}
// n — ширина поля, рисуемого на поле
// вот тут я бы хотел узнать какой-нибудь другой алгоритм
int n = (int) Math.floor(Math.sqrt(btnColors.size())) + 1;
// для каждого столбца
for (int i = 0; i < n; i++) {
// здесь если поставить =, то функция внутри будет вылетать, если входных цветов отличное от идеального количество
for (int j = 0; j <= (btnColors.size() / n); j++) {
// на панель добавляется кнопка на позиции j*n+i на место i, j
add(buttons.get(j*n+i), new GridBagConstraints(i,j,1,1,0,0,GridBagConstraints.NORTH,GridBagConstraints.NONE,new Insets(1,1,1,1),0,0));
}
}
}Не по теме:
Ну и, если я действительно чего-то не знаю, то помогите со строкой 10, где создаётся final переменная для использования её в лямбда выражениях.
Решение задачи: «Создание массива кнопок на панели»
textual
Листинг программы
for (int i = 0; i < n; i++) {
for (int j = 0; j <= (btnColors.size() / n); j++) {
if ((j*n+i) < buttons.size()) {
add(buttons.get(j*n+i), new GridBagConstraints(i,j,1,1,0,0,GridBagConstraints.NORTH,GridBagConstraints.NONE,new Insets(0,0,0,0),0,0));
}
}
}