Java倒置文本-Bug还是特性?

Java倒置文本-Bug还是特性?,java,swing,language-features,Java,Swing,Language Features,在使用Java字体类和Swing时,我将字体大小设置为负值 我发现这会使文本被颠倒过来。这是一个bug还是一个特性?有人能解释为什么会发生这种行为吗 试一试: import java.awt.Font; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class UpsideDown extends JFrame{ public UpsideDown(){

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

我发现这会使文本被颠倒过来。这是一个bug还是一个特性?有人能解释为什么会发生这种行为吗

试一试:

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

似乎正在发生这样的事情:

  • Swing向下绘制字体高度,因为它将字体大小与字体的字形高度相乘<代码>-50*字形高度为负值->向下绘制,而不是向上绘制
  • 它还会向左绘制字形(字母)的宽度,这也是因为它将字体大小与字体指定的字形宽度相乘
  • 这是一个特点。 在Swing中,绝对量很少(如果有的话)。几乎所有的量都是代数的,这意味着它们可以是负数,它们可以参与代数计算,这可能会改变它们的符号,就像你乘以-1时的情况一样。例如,一个矩形的宽度可以为负,这很好。字体不是此规则的例外

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

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

                g2.scale( -1.0, -1.0 );
                g2.translate( -getWidth(), -getHeight() );
      
    • 现在检查结果。它将完全朝上朝下,如下所示:

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

    这说明了所有东西,一直到字符标志符号的各个坐标,都是一个摆荡的代数量


    这给了很大程度的自由。如果你想反转图表,但要保持文本的笔直,一种方法是使字体大小为负。Voor字体坐标的< /P>是以字体大小作为等式的一部分来计算的。@ TrbjjrnravnnordEn森用WTE‘不是bug’前缀-我会认为这是一个答案。“无效操作”或“未定义行为”,因为没有“负字号”这类东西。与RGB颜色相比:如果某些实现允许您为红色设置负值,该怎么办?@Jongware这将是一个问题,因为图形驱动程序通常只为每种颜色使用一个字节。这可能会导致图形驱动程序崩溃,或者它会将
    red=-1
    环绕到
    red=255
    :)是的,但这是因为RGB是以这种方式实现的(幸运的是,您添加了“通常”)。如果“字体大小”存储在无符号类型中,则也不会出现此问题。@不幸的是,Java没有无符号基元类型,并且编码人员没有向
    font
    构造函数添加检查。