使用drawString对阿拉伯语打印时,打印方向怎么设置成从右往左打印?

解决方案 »

  1.   


    字符逆序 new StringBuilder("string").reverse().toString();对齐问题自行计算坐标
    ……为什么要用 drawString ?
      

  2.   


    我是在网上搜的打印例子,里面用的就是drawstring。
    我刚测试了一下,这个办法不行啊。
    如果不用drawstring,那应该使用什么能从右往左打印啊?
      

  3.   


    你实际想要的是不是就是 右对齐?你说 drawString 我还以为是 Graphics 2D …… 原来是打印机 ……
      

  4.   


    就是Graphics 2D 。下面是我的打印功能部分代码。中文部分没有问题,但是阿拉伯语部分,总是打印出来时反的。调试过程中,line里的赋值的方向是正确的。但是打印出来的阿拉伯语就是反的。 public  void paint(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;        g2.setPaint(Color.white);        Vector page = (Vector) pageVector.elementAt(currentPageIndex);        g2.setFont(font);
            
    //        font.LAYOUT_LEFT_TO_RIGHT();
            g2.setPaint(Color.black);
           double x = pageFormat.getImageableX();
         //   double x= pagewidth-130;
            float y = fontSize;
         
            this.z=(int)y;
            for (int i = 0; i < page.size(); i++) {
              String line = (String) page.elementAt(i);
              FontMetrics metrics=g2.getFontMetrics();
         
              if (line.length() > 0)
               drawWrapString(g2,line,(int)x,(int)this.z,pagewidth-130,metrics);
                                                       //biaoji
              this.z +=fontSize;
            
            
            }
          }public void drawWrapString(Graphics g,String str, int x, int y,int rightMargin,FontMetrics font) {
            
            int leftMargin = x;// 左边距
            int fW = 0;// 单个字符的宽
          
            char c;
            for (int i = 0; i < str.length(); i++) {
                c = str.charAt(i);
                fW = font.charWidth(c);
    //       if (currentPageIndex < pageVector.size() - 1)
    //        currentPageIndex++;
                if ( (x + fW) > rightMargin) {
                    x = leftMargin; // 改变x坐标
                    y += fontSize; 
                // 换行
                   
                   this.z=y;
                   
                }
        
              g.drawString(c+"", x, y);
                x += fW; // 使X坐标变大        }
        
        }
      

  5.   

    用这个方法:
    drawString
    public abstract void drawString(String str,
                                    int x,
                                    int y)使用 Graphics2D 上下文中的当前文本属性状态呈现指定的 String 的文本。首字符的基线位于用户空间的 (x, y) 位置处。应用的呈现属性包括 Clip、Transform、Paint、Font 和 Composite 属性。对于脚本系统(如 Hebrew 和 Arabic)中的字符,在提供的坐标位于基线上最左边字符的情况下,可以从右到左呈现字形。 指定者:
    类 Graphics 中的 drawString
    参数:
    str - 要呈现的字符串
    x - 呈现 String 位置的 x 坐标
    y - 呈现 String 位置的 y 坐标 
      

  6.   

    BufferedImage image = cloneImage(cache.getImage(colorCost,
    Cache.CARDBACKGROUND)); Graphics2D imageG = image.createGraphics();
    imageG.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);
    imageG.setRenderingHint(RenderingHints.KEY_RENDERING,
    RenderingHints.VALUE_RENDER_QUALITY); Font f = new Font("Helvetica", Font.BOLD, 24);
    // TextLayout tl = new TextLayout(container.getName(), f, frc);
    // imageG.setColor(Color.black);
    // tl.draw(imageG, 50, 79); AttributedString ats = new AttributedString("testing it all");
    ats.addAttribute(TextAttribute.RUN_DIRECTION, TextAttribute.RUN_DIRECTION_RTL);

    ats.addAttribute(TextAttribute.FONT, f);
    AttributedCharacterIterator iter = ats.getIterator(); FontRenderContext frc = imageG.getFontRenderContext();
    TextLayout tl = new TextLayout(iter, frc);
    System.out.println("direction = " + tl.isLeftToRight());
    tl.draw(imageG, 640, 79); this.setSize(image.getWidth(), image.getHeight());
    g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);