Отображение многострочного JLabels в пользовательской консоли? - PullRequest
1 голос
/ 18 января 2020

Я работал над пользовательской консолью для игры, над которой я работаю, но когда она пытается отобразить длинные сообщения, она добавляет «..» в конце и не отображает сообщение целиком, размеры JFrame 720x480, а вот код без расчета:

while ((line = in.readLine()) != null) {
    JLabel label = new JLabel(line, SwingConstants.LEFT);
    label.setBounds(5, currentLine*15, 720, 15);
    label.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 15));
    frame.add(label);
    frame.repaint();
    currentLine++;
}

и вот он с расчетом:

 while ((line = in.readLine()) != null) {
    JLabel label = new JLabel(line + " AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", SwingConstants.LEFT);
    double textWidth = label.getMaximumSize().getWidth();
    int lineSize = 1;
    lineSize = (int) Math.ceil(textWidth / 720);
    System.out.println(lineSize); // prints 2

    label.setBounds(5, currentLine*20, 720, lineSize*20);
    label.setMaximumSize(new Dimension(720, lineSize*20));
    label.setFont(ConsoleFont);
    frame.add(label);
    frame.repaint();
    currentLine += lineSize;
}

но разница в том, что при расчете он увеличивает размер JLabel, но не ' сделать это текст

1 Ответ

1 голос
/ 18 января 2020

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. Создание нового идентичного Объекты шрифта тратят впустую память.)

...