是否可以部分突出角色?

时间:2014-09-03 14:53:11

标签: java css swing javafx

是否有可能在Swing

中实现这样的目标

enter image description here

请注意, A 部分着色。

我知道单独使用DefaultHighlighter课程可能无法实现。 (JTextArea上显示的文字)

任何解决方案都可以单独Swing完成此操作或必须应用CSS

修改

如果使用swing无法实现这一点,那么任何带有以下标签的解决方案都会出现?

1 个答案:

答案 0 :(得分: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

基本上,你渲染从单行歌词中获取文本布局,然后将其转换为形状(=每个字母的轮廓)。然后,您可以将此形状用作剪裁区域以渲染渐变。

在您的情况下,您需要一个突出的渐变,其宽度是您要渲染的最长文本行的两倍。适当地移动它以在您需要的文本的位置更改渐变。