6

在使用 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();
    }
}

上下翻转

4

2 回答 2

6

似乎正在发生这种情况:

  1. Swing 将字体的高度向下绘制,因为它将字体大小与字体的字形高度相乘。-50 * glyph_height是负数 -> 向下而不是向上绘制。
  2. 它还将字形(字母的)宽度绘制到左侧,这也是因为它将字体大小与字体指定的字形宽度相乘。
于 2013-09-08T09:52:39.930 回答
3

这是一个特点。

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

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

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

在此处输入图像描述

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

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

在此处输入图像描述

不用说,如果你把 x 比例加倍而不把 y 比例加倍,那么一切都会被拉长,包括文本的字符,如下所示:

在此处输入图像描述

这演示了一切,一直到字符字形的各个坐标,都是 Swing 中的代数量。

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

于 2021-04-25T16:44:35.657 回答