2013-02-21 38 views
1

我有一定的文字,我想爲用戶註釋。不幸的是,我甚至不知道從哪裏開始。我的算法給出了一個字符串的輸出範圍。什麼我打算是這樣的:使用java格式化:混合文本和圖片

example

我需要兩種方式來標記的人物(藍線,紅線),也許還顛倒的字符(給角色不同的背景) ,或讓他們變胖。特別困難的是將圖片(這裏用兩個黑點表示)與字符對齊。由於角色應該在新快遞中,我可以知道在哪裏放置膠印,但我似乎無法做到。

最後,我將不得不在X字符之後應用一箇中斷並開始一個新行,就像在圖片中一樣。我還沒有找到任何示例如何用java來解決這個問題。用python我可以使用ImageDraw,但是我用java來了水。

是否可以在屏幕上的畫布中顯示此項並將其導出爲svg或pdf?我不知道任何可以做到這一點的圖書館。所以我很樂意接受這樣的建議/例子。

+0

是文本編輯?還是僅可見? – assylias 2013-02-25 10:13:42

+0

文本只能查看,這是一個顯示畫布 – tarrasch 2013-02-25 12:09:57

+1

您使用的是Swing嗎?如果是,請按照下面的答案中的建議查看Text-API。 Higlighter是一個選項。爲了更多的靈活性,將其中一個View類繼承下來。通過這個你可以添加特殊的角色裝飾。 API可以從模型(字符索引)轉換爲查看(圖形像素),反之亦然,可以使用任何字體。查看K.Topley的「Core Swing Advanced Programming」(ISBN 978-0130832924)。通過本書,我增強了JTextPane的隱藏文本,更多風格的裝飾和追蹤插入和刪除(cmp。MS Word)。欲瞭解更多信息,請發表評論。 – Claude 2013-03-01 19:49:52

回答

1

關鍵是要處理FontMetrics API。你可以做的最好的就是看這reference doc

以下是演示此用法的示例代碼。它根據一系列字符在「Hello world」文本週圍繪製紅色和藍色線條。

的文字是一個JLabel裏面,但你可以在任何組件上適應paint方法(但你必須打電話graphics.drawChars繪製文本。)

(代碼不是很漂亮,但是它演示FontMetrics對象的使用)

package com.example.swing; 

import javax.swing.*; 
import java.awt.*; 

public class DemoFontMetrics { 

    public static void main(String[] args){ 
     JFrame frame = new JFrame(); 
     DecoratedLabel label = new DecoratedLabel("hello world !",new int[]{2,4}, new int[]{6,9}); 
     JPanel textContainer = new JPanel(new FlowLayout()); 
     textContainer.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
     textContainer.add(label); 
     frame.getContentPane().add(textContainer); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private static class DecoratedLabel extends JLabel{ 

     int startBlue; 
     int endBlue; 
     int startRed; 
     int endRed; 

     private DecoratedLabel(String text, int[] blueRange, int[] redRange) { 
      super(text); 
      startBlue = blueRange[0]; 
      endBlue = blueRange[1]; 
      startRed = redRange[0]; 
      endRed = redRange[1]; 
     } 

     @Override 
     public void paint(Graphics g) { 
      super.paint(g); //draw text 

      //set line with : 3 
      Stroke stroke = new BasicStroke(3f); 
      ((Graphics2D)g).setStroke(stroke); 

      FontMetrics fm = g.getFontMetrics(); 
      int h = fm.getHeight(); 

      //compute blue line coordonate 
      fm.stringWidth(getText().substring(0,startBlue)); 
      int x1 = fm.stringWidth(getText().substring(0, startBlue)); 
      int x2 = fm.stringWidth(getText().substring(0, endBlue)); 
      g.setColor(Color.BLUE); 
      g.drawLine(x1,0,x2,0);// draw blue line 

      //compute red line coordonates 
      int x3 = fm.stringWidth(getText().substring(0,startRed)); 
      int x4 = fm.stringWidth(getText().substring(0, endRed)); 
      g.setColor(Color.RED); 
      g.drawLine(x3,h-1,x4,h-1); // draw redline 

     } 
    } 
} 
+0

感謝您的建議。我怎麼能把linebreak和grafics整合進去呢? – tarrasch 2013-02-25 15:08:07

0

您可以直接創建svg,例如:http://xmlgraphics.apache.org/batik/這是一個基於xml的矢量圖形格式。

編輯:你可以在java中顯示svg,你可以用java創建pdf。你可以在網上發佈它(就像svg一樣)。

1

如果文本通過JTextPane顯示您可以方便地自定義一個HighlightPainter,繪製線之上或之下的文本。

然後你就可以通過編程調用增添亮點的文本窗格:

textPane.getHighlighter().addHighlight(startPos, endPos, 
     myLineHighlightPainter); 

圖像可能也很容易被添加到面板中,通過:

textPane.setIcon(myImageIcon);