Добавление кнопок J в цикл - PullRequest
0 голосов
/ 28 марта 2020

JAVA Swing Problem

Я хочу создать список кнопок J на ​​основе списка строк, который представляет текст кнопки. На первом этапе я собираю свои данные для текстов кнопок из внешнего текстового файла. Эти данные хранятся в переменной данных.

List<String> data = ReadFile("texts.txt")

Теперь я хочу создать список кнопок J с именованными кнопками. Там я установил их текст и их границы. Границы указаны относительно индекса, поэтому кнопки расположены ниже друг друга. Наконец, я добавляю кнопку в рамку и в список кнопок.

List<JButton> buttons = new ArrayList<>();
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);
    buttons.add(button);

Но когда я выполняю это, последняя кнопка заканчивается большим, первые также исчезают, когда я не наводю на них курсор, но это основано на том факте, что последняя кнопка расположена выше:

Изображение выполненного скрипта

Последняя кнопка имеет размер кадра, не ' Не имеет значения, если я изменю размер рамки:

Изображение экрана с измененным размером

Я надеюсь, что кто-то может мне помочь или сказать, где я могу найти помощь. Спасибо.

1 Ответ

1 голос
/ 28 марта 2020

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

Это потому, что по умолчанию панель содержимого 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 на Менеджер макетов для получения дополнительной информации и примеров. .

...