Java颠倒文本 - 错误还是功能?

时间:2013-09-08 09:47:20

标签: java swing language-features

在使用Java字体类和Swing时,我将字体大小设置为负值。

我发现这会使文本被颠倒。这是一个错误还是一个功能?谁能解释为什么会出现这种情况?

尝试一下:

import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class UpsideDown extends JFrame{

    public UpsideDown(){
        setSize(500,500);
        setContentPane(new Panel());
        setVisible(true);
    }

    public class Panel extends JPanel{
        public void paintComponent(Graphics g){
            Font f = new Font("Sans-Serif", Font.PLAIN, -50);
            g.setFont(f);
            g.drawString("Upside Down", 400, 100);
        }
    }

    public static void main(String args[]){
        new UpsideDown();
    }
}

Upside Down

2 个答案:

答案 0 :(得分:6)

似乎正在发生这种情况:

  1. Swing向下绘制字体的高度,因为它将字体大小与字体的字形高度相乘。 -50 * glyph_height是否定的 - >向下而不是向上。
  2. 它还将字形(字母)的宽度绘制到左侧,这也是因为它将字体大小与字体指定的字形宽度相乘。

答案 1 :(得分:2)

这是一个功能。

在 Swing 中,绝对数量很少(如果有的话)。几乎所有的量都是代数的,这意味着它们可以是负数,并且它们可以参与代数计算,这可能会改变它们的符号,就像乘以 -1 时的情况一样。例如,矩形可以具有负宽度,这完全没问题。字体也不例外。

无论如何,一定要在家里试试这个:

  • 使用您可能拥有的任何一段在 Graphics2D 图形上下文中绘制 2D 图形的代码。 (这将是一个覆盖 paintComponent( Graphics g ) 并以 Graphics2D g2 = (Graphics2D)g; 开头的组件)例如,您可能有一个绘制图形的组件,如下所示:

enter image description here

  • 在绘图操作之前,插入以下两行:

              g2.scale( -1.0, -1.0 );
              g2.translate( -getWidth(), -getHeight() );
    
  • 现在检查结果。一切都将完全颠倒,就像这样:

enter image description here

不用说,如果您将 x 比例加倍而不将 y 比例加倍,那么所有内容都会被拉长,包括文本的字符,如下所示:

enter image description here

这说明了所有东西,一直到字符字形的各个坐标,都是 Swing 中的代数量。

这提供了很大的自由度。如果您想反转图形但要保持文本直立,实现它的一种方法是使字体大小为负。