2014-09-03 72 views
1

是否有可能实现这样的事情在Swing:这里是否可以部分突出显示一个字符?

enter image description here

注意一个部分着色。

我知道可能是它不可能与DefaultHighlighter单独。 (文本显示在JTextArea

任何解决方案在Swing的单独或必须申请CSS

编辑:

如果这是不可能的摇摆,用下面的代码有任何解决方案?

+0

我认为它不能完成,即使使用CSS。也许你将不得不生成一个图像 – Leo 2014-09-03 14:57:54

回答

4

类似这样的事情可能与Java 2D但不与JTextArea。所以你可以创建一个代码来渲染这个框架,但我认为你不会找到一种简单的方法来为文本编辑器添加对此的支持(嗯,你可以在文本编辑器中总是使用embed an image,但这可能不是你想)。

[编辑]对于卡拉OK播放器的文本显示来说,Java 2D是最佳选择。 Java编辑器API将以您的方式获得。

这里是绘制文本用渐变的例子:

public void sayWorld(Graphics2D g2D, int x, int y, boolean shear) { 
     final String txt = "Hello World!"; 

     // gradient color from blue to red 
     GradientPaint gp = new GradientPaint((float)x, (float)y, Color.blue, 
          x+100, y+20, Color.red); 
     g2D.setPaint(gp); 
     if (shear) g2D.shear(-0.5,0.0); 
     else  g2D.shear(+0.5, 0); 
     g2D.drawString(txt, x, y); 

     FontRenderContext frc = new FontRenderContext(null,false,false); 

     TextLayout tl = new TextLayout(txt, font, frc); 
     AffineTransform textAt = new AffineTransform(); 
     //textAt.translate(0, (float)tl.getBounds().getHeight()); 
     textAt.translate(x,y); 
     //textAt.shear(-0.5,0.0); 

     Shape outline = tl.getOutline(textAt); 
     g2D.setColor(Color.yellow); 
     BasicStroke wideStroke = new BasicStroke(2); 
     g2D.setStroke(wideStroke); 
     g2D.draw(outline); 
    } 

source

基本上,你渲染得从歌词的单行文本布局,然后再转换到一个形状(=每个字母的轮廓)。然后,您可以使用此形状作为剪辑区域来渲染渐变。

对于您的情况,您需要一个突变梯度,其宽度是要渲染的最长文本行的两倍。适当地移动它可以在你需要的地方找到文本的渐变。

+0

我已经想到了2D,但这将是复杂的逻辑。可能是我应该编辑标签。 – 2014-09-03 15:06:00

+0

我不明白你的意思是“逻辑太复杂”。只需从文本中加上一个路径加一个颜色范围,然后使用该路径作为剪辑区域来填充一个矩形? – 2014-09-03 15:07:02

+0

它就像一个卡拉OK播放器。如果我采用这种解决方案,我可能会失去同步。时间调整到纳秒精度。滚动将是一个痛苦。 – 2014-09-03 15:11:03

相关问题