【问题标题】:method closes program for no reason [duplicate]方法无缘无故关闭程序[重复]
【发布时间】:2018-06-20 20:03:21
【问题描述】:

在我的大学项目中,我需要显示球员的姓名和他们的得分。 我希望它看起来像这样:

Name1 . . . . . . . . 1200
Another Name . . . . . . 3
A Very Very Long name  . 2

为了知道点的数量,我需要知道屏幕上字符串的长度,所以所有的字符串都会有相同的长度。 text.length 不会有帮助,因为像 l 这样的字母占用的空间比 T 少。

在网上看了一会儿,发现有人说,为了得到屏幕上字符串的长度,我可以这样做:

private int stringViewLength(String text) {
    AffineTransform affinetransform = new AffineTransform();     
    FontRenderContext frc = new FontRenderContext(affinetransform, true, true);     
    Font font = new Font(FONT, Font.PLAIN, FONT_SIZE);

    int textWidth = (int)(font.getStringBounds(text, frc).getWidth()); // This line causes problems
    int textHeight = (int)(font.getStringBounds(text, frc).getHeight()); // Not in use

    return textWidth;
}

问题在于:

int textWidth = (int)(font.getStringBounds(text, frc).getWidth()); // This line causes problems

由于某种原因,将不允许程序运行。它不会抛出任何异常,也不会返回意外值,也不会关闭程序。 调试后看到只要执行了这一行, 在main 函数的末尾,由于某种原因,调用了Thread 中的exit() 方法,但是当我评论这一行时(并将return 语句替换为一个const 数),显示该行在屏幕上。

什么会导致这个问题?谢谢!

【问题讨论】:

  • 我不能代表所有人,但我知道通过您创建并发布一个有效的minimal reproducible example 程序和您的问题,一个小程序,我会非常受益,小到可以作为代码格式的文本发布在问题中,它可以编译、运行并为我们演示问题,仅此而已。
  • 请注意,如果您在 Swing GUI 文本组件(例如 JTextArea)中显示文本,那么为什么不简单地制作字体Font.MONOSPACED,这样字符串长度可能 好好利用。
  • 选项 2:如果这是一个 Swing GUI 并且您正在尝试显示表格数据,请使用 JTable,这是一个专门为表格数据的显示和操作而构建的组件。
  • 哦,不知道我能做到这一点,谢谢!
  • 您是否尝试用 try 块包围有问题的行,并查看是否捕获到任何异常?实际上可能存在在其他地方(调用 exit() 的地方)处理的异常。

标签: java string swing


【解决方案1】:

我认为您过度设计了解决方案。您无法轻松对齐非等宽字体中的任何文本。只需使用 Courier 并继续学习构建应用程序的课程目的。有时最好的教训是使用最简单的解决方案。

【讨论】:

    猜你喜欢
    • 2018-08-17
    • 2014-02-24
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    相关资源
    最近更新 更多