【问题标题】:My ASCII art is wrong on a JLabel我的 ASCII 艺术在 JLabel 上是错误的
【发布时间】:2014-05-14 16:52:35
【问题描述】:

我试图用 ASCII 艺术制作一个 -> 箭头,但我的 JLabel 不配合。它给了它这样的外观:

这使它看起来像_>或其他东西。我该如何解决?

SSCCE:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;

public class Test {
    public static void main(String[] args) {
        JFrame j = new JFrame("TEST");
        j.add(new JLabel(" -> "));
        j.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        j.pack();
        j.setSize(j.getWidth() * 3, j.getHeight() * 3);
        j.setLocationRelativeTo(null);
        j.setVisible(true);
    }
}

【问题讨论】:

  • 将标签的字体设置为箭头看起来不错的字体。
  • 或者也许使用 \u2192 unicode 箭头。
  • @RussellZahniser:现在这是一个很好的答案。我会把它作为一个发布。随意添加一个答案,复制您认为对我有帮助的任何文本并添加,我会删除我的。

标签: java swing ascii-art


【解决方案1】:

- 相对于> 的位置取决于字体。您必须找到另一种方法来执行此操作,或者使用您希望的放置方式的字体。

等宽字体倾向于- 放在> 旁边,但这并不能保证。例如,现在在 SO 上,-> 看起来与 -> (对我而言)大致一样错位。

一个更好的答案,Russell Zahniser 在评论中(如果他将其作为答案发布,我将删除这个),是使用(许多)Unicode 箭头之一,例如\u2192。有一个有用的列表here on the unicode.org site

【讨论】:

  • 确实-> 在这里看起来有点(!)错位,但是……这不仅是 font 的问题,也是 尺寸。 (这样说:对于一个 20 像素高的角色来说,根本就没有“垂直中心”......)。缩放页面(使用 CTRL+MouseWheel)显示-> 的对齐与“某些”尺寸相匹配,而对于“某些”其他尺寸,它似乎偏离了 1 点......(编辑:我刚刚注意到它在 comment 中对我来说看起来完美对齐,尽管它在 answer 中未对齐...)
  • 如果@Russel 发布它,我将切换到他的答案,感谢您提供关于高度的等宽字体注释。
  • @Marco 有趣的是,Chrome 似乎会缩放字体大小,所以当我缩放时,我会得到非常高清的字体,而且我看不到任何问题。
  • @KenzieTogami:是的,没错。而对我来说(也在 Ubuntu 上使用 Chrome)我可以清楚地看到错位。 Unzoomed - zoomed
【解决方案2】:

正如其他人所指出的,您至少必须使用“等宽”字体。虽然这一定意味着-垂直 对齐方式将匹配>,但对于标准字体来说应该如此。无论如何,“等宽”的属性将确保所有字符的 width 相等,这对于 ASCII 艺术至关重要。

import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;

public class Test
{
    public static void main(String[] args)
    {
        JFrame j = new JFrame("TEST");

        JLabel label = new JLabel(" -> ");
        label.setFont(new Font("Monospaced", Font.PLAIN, 12));

        j.add(label);
        j.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        j.pack();
        j.setSize(j.getWidth() * 3, j.getHeight() * 3);
        j.setLocationRelativeTo(null);
        j.setVisible(true);
    }
}

【讨论】:

  • 等宽​​字体不能保证- / > 对齐。
  • @T.J.Crowder 当然(在您撰写评论时在编辑中插入此内容),但唯一“普遍正确”的声明是“您必须使用包含这些字符的字体以所需的方式匹配”。这对提问者没有帮助(而且我从未见过在“Monospspaced”字体中,这些字符 not 至少大致像那样对齐 - 几乎所有 ASCII 艺术都是简单地用“默认”等宽字体...)
【解决方案3】:

两者的区别

->

->

是字体。如果这是 ASCII 艺术,您应该通过setFont 为您的 JLabel 使用等宽字体(Consolas、Courier New、Monaco...)。类似:

JFrame j = new JFrame("TEST");
JLabel label = new JLabel(" -> ");
label.setFont(new Font("Courier New", Font.PLAIN, 12)));
j.add(label);
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-27
    • 2016-10-12
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多