последняя кнопка заканчивается большим, первые также исчезают, когда я не наводю на них курсор,
Это потому, что по умолчанию панель содержимого JFrame использует BorderLayout
. При добавлении компонента к BorderLayout
кнопка добавляется к CENTER
. Однако к CENTER
может быть добавлен только один компонент, поэтому BorderLayout управляет только размером / расположением последнего добавленного компонента.
Не пытайтесь установить размер / расположение вашего компоненты вручную. Это работа менеджера по расположению, чтобы сделать это. В вашем случае вы можете использовать несколько панелей с разным расположением, поэтому выровняйте свою кнопку в столбце слева. Примерно так:
JPanel buttonPanel = new JPanel( new GridLayout(0, 1) );
for (int index = 0; index < data.size(); index++) {
JButton button = new JButton();
button.setText(data.get(index));
button.setBounds(0, index*50, 100, 50);
//add(button);
buttonPanel.add( button );
buttons.add(button);
}
add(buttonPanel, BorderLayout.LINE_START);
Попробуйте приведенный выше код, и вы заметите, что все кнопки имеют одинаковый размер, но размер продолжает изменяться с изменением высоты рамки.
Чтобы предотвратить это изменение размера, нам нужно разрешить отображение кнопки на нужной высоте с помощью дополнительного менеджера макета:
//add(buttonPanel, BorderLayout.LINE_START);
JPanel wrapper = new JPanel( new BorderLayout() );
wrapper.add(buttonPanel, BorderLayout.PAGE_START);
add(wrapper, BorderLayout.LINE_START);
Прочтите руководство по Swing на Менеджер макетов для получения дополнительной информации и примеров. .