Java 在自定义控制台中显示多行jlabel?
我正在为我正在开发的游戏开发一个自定义控制台,但当它试图显示长消息时,它会添加“.”。在最后,JFrame的尺寸为720x480,不显示整个消息,下面是未经计算的代码: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
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