JLabel уже знает размер, необходимый для отображения его содержимого. Этот размер возвращается getPreferredSize .
Вам не придется самостоятельно определять позиции и размеры, если вы используете LayoutManager. В вашем случае вертикальной рамки , вероятно, будет достаточно:
private Box linesContainer = Box.createVerticalBox();
private Font linesFont = new Font(Font.MONOSPACED, Font.PLAIN, 15);
// ...
frame.add(linesContainer);
// ...
while ((line = in.readLine()) != null) {
JLabel label = new JLabel(line, SwingConstants.LEFT);
label.setFont(linesFont);
linesContainer.add(label);
// Add spacing.
linesContainer.add(Box.createVerticalStrut(3));
Вот еще одна веская причина использовать LayoutManager: вы не знаете, сколько пикселей на самом деле имеет 15-точечный шрифт на чужих компьютерах. 15 баллов не означает 15 пикселей; это означает ¹⁵⁄₇₂ дюйма и количество пикселей, необходимое для отображения, которое будет зависеть от шага точки на мониторе пользователя.
Вы можете попытаться вычислить это самостоятельно, но Swing уже делает все это работает, если вы позволите LayoutManager, как тот, который используется внутри Box, выполнять свою работу.
(Также обратите внимание, что я переместил создание шрифта за пределы l oop. Создание нового идентичного Объекты шрифта тратят впустую память.)