Java 在自定义控制台中显示多行jlabel?

Java 在自定义控制台中显示多行jlabel?,java,string,swing,jframe,jlabel,Java,String,Swing,Jframe,Jlabel,我正在为我正在开发的游戏开发一个自定义控制台,但当它试图显示长消息时,它会添加“.”。在最后,JFrame的尺寸为720x480,不显示整个消息,下面是未经计算的代码: while ((line = in.readLine()) != null) { JLabel label = new JLabel(line, SwingConstants.LEFT); label.setBounds(5, currentLine*15, 720, 15); label.setFont

我正在为我正在开发的游戏开发一个自定义控制台,但当它试图显示长消息时,它会添加“.”。在最后,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;
}
这是经过计算得出的结果:

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的大小,但对文本没有影响

JLabel已经知道显示其内容所需的大小。该大小由返回

如果你使用一个布局经理,你就不必自己计算位置和大小。在您的情况下,a可能就足够了:

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个像素;它的意思是⁵⁄₇₂ 英寸,以及需要显示多少像素,这将取决于用户显示器的点距

您可以自己尝试计算,但如果您让布局管理器(如Box内部使用的布局管理器)完成其工作,Swing已经完成了所有这些工作


(还请注意,我将字体的创建移到了循环之外。创建新的、相同的字体对象会浪费内存。)

JLabel。如何获取它?1)为了更快地获得更好的帮助,请添加或。硬编码数据以替换(外部文件和)输入流。2) Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或与…的布局填充和边框一起使用。。。。3) 请学习常见的Java命名法(命名约定-例如,
EachWordUpperCaseClass
firstWordLowerCaseMethod()
firstWordLowerCaseAttribute
,除非它是一个
大写常量
),并始终如一地使用它。不起作用,我试图计算高度,但文本仍然有效。。在结尾,你能分享一个导致这个问题的文本示例吗?它只是一行文本,但我组合了一个长的“AAA…”文本来测试它。你对框的边界进行了硬编码吗?也许加宽一点会有帮助吗?我把每行的大小增加到20,但字体保持在15