我正在为自己正在开发的游戏使用自定义控制台,但是当它尝试显示长消息时,它会在末尾添加“ ..”,而不会显示整个消息,因此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的大小,但不会对其文本起作用
JLabel已经知道显示其内容所需的大小。该大小由getPreferredSize返回。
如果您使用LayoutManager,则无需自己弄清楚位置和尺寸。在您的情况下,vertical Box可能就足够了:
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像素;它表示1/4英寸,显示多少像素取决于用户显示器的点距。
您可以尝试自己计算一下,但是如果让LayoutManager(如Box内部使用的LayoutManager)执行其工作,Swing已经可以完成所有工作。
((还要注意,我将Font的创建移到了循环之外。创建新的相同Font对象会浪费内存。)