Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用Graphics2D旋转文本?_Java_Awt_Graphics2d - Fatal编程技术网

如何在Java中使用Graphics2D旋转文本?

如何在Java中使用Graphics2D旋转文本?,java,awt,graphics2d,Java,Awt,Graphics2d,我想使用Graphics2D旋转JPanel上的文本 我的代码是: double paso=d.width/numeroBarras; double alto=datos[i].valor; Font fBarras=new Font("Serif", Font.PLAIN, 15); g2.setFont(fBarras); Rectangle2D barra=new Rectangle2D.Double(x,d.height-a

我想使用Graphics2D旋转JPanel上的文本

我的代码是:

double paso=d.width/numeroBarras;
        double alto=datos[i].valor;
        Font fBarras=new Font("Serif", Font.PLAIN, 15);
        g2.setFont(fBarras);
        Rectangle2D barra=new Rectangle2D.Double(x,d.height-alto,paso,alto);
        //g2.fill(barra);
        x+=paso;
        g2.draw(barra);
        g2.rotate(-Math.PI/2);
        g2.setColor(Color.BLACK);
        g2.drawString(datos[i].titulo,(float)alto,(float)paso)
此方法必须在矩形上绘制矩形和文本,但当我运行此方法时,所有图形都会旋转,我只想旋转文本

谢谢:)

该方法将变换应用于所有后续渲染操作。可以在应用旋转之前保留变换的副本(使用),然后恢复原始

g2.draw(barra);
AffineTransform orig = g2.getTransform();
g2.rotate(-Math.PI/2);
g2.setColor(Color.BLACK);
g2.drawString(datos[i].titulo,(float)alto,(float)paso);
g2.setTransform(orig);

我有一段代码,其中添加了包含矩形对象的代码。 我可以看到我的文本正在旋转,而不是矩形

Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

String s = "dasdasdasd1";

Font font = new Font("Courier", Font.PLAIN, 12);
g2d.translate(20, 20);

FontRenderContext frc = g2d.getFontRenderContext();

GlyphVector gv = font.createGlyphVector(frc, s);
int length = gv.getNumGlyphs();
Rectangle2D barra=new Rectangle2D.Double(0, 0, 700, 500);
g2d.draw(barra);
for (int i = 0; i < length; i++) {
  Point2D p = gv.getGlyphPosition(i);
  AffineTransform at = AffineTransform.getTranslateInstance(p.getX(), p.getY());
  at.rotate((double) i / (double) (length - 1) * Math.PI / 3);

  Shape glyph = gv.getGlyphOutline(i);
  Shape transformedGlyph = at.createTransformedShape(glyph);
  g2d.fill(transformedGlyph);
}
graphics2dg2d=(Graphics2D)g;
g2d.setRenderingHint(renderingHits.KEY\u抗锯齿,renderingHits.VALUE\u抗锯齿\u开启);
字符串s=“dasd1”;
Font Font=新字体(“Courier”,Font.PLAIN,12);
g2d.翻译(20,20);
FontRenderContext frc=g2d.getFontRenderContext();
GlyphVector gv=font.createGlyphVector(frc,s);
int length=gv.getNumGlyphs();
矩形2D barra=新矩形2D.Double(0,0700500);
g2d.draw(巴拉);
for(int i=0;i

可能您可以尝试使用此方法。

此方法将旋转文本,并将渲染所有其他形状

Graphics2D g2 = (Graphics2D) g;
Font font = new Font(null, Font.PLAIN, 10);    
AffineTransform affineTransform = new AffineTransform();
affineTransform.rotate(Math.toRadians(45), 0, 0);
Font rotatedFont = font.deriveFont(affineTransform);
g2.setFont(rotatedFont);
g2.drawString("A String",0,0);
g2.dispose();

如果您不想使用
AffineTransform
,则此代码更好

public static void drawRotate(Graphics2D g2d, double x, double y, int angle, String text) 
{    
    g2d.translate((float)x,(float)y);
    g2d.rotate(Math.toRadians(angle));
    g2d.drawString(text,0,0);
    g2d.rotate(-Math.toRadians(angle));
    g2d.translate(-(float)x,-(float)y);
}    
用法:

drawRotate(g2d, 100, 100, 45, "hello world");    // 100x100px, 45 degree, 

所以它旋转字符串而不是坐标系?它修改当前渲染上下文。参考说明转换用于从用户空间坐标系转换到设备空间。所以,它旋转坐标系:)本例的最后一行是在字符串渲染后恢复变换。对!这种方法旋转整个坐标系,这张拉丝的X和Y也表示在旋转的坐标系中。因此,您可能会在转换后的坐标系中将字符串拉到0,0位置。这应该是可以接受的答案,因为它更简单,因此适用于更广泛的情况+这就是我想要的!在我的例子中,我想垂直翻转文本,这就是我所做的:Font-oldFont=g2.getFont();Font newFont=oldFont.deriveFont(仿射Transform.getScaleInstance(1,-1));g2.setFont(newFont);