java - 是否可以部分突出显示字符?

标签 java css swing javafx

是否有可能在 Swing 中实现这样的功能:

enter image description here

注意这里的 A 是部分着色的。

我知道单独使用 DefaultHighlighter 类可能是不可能的。 (显示在 JTextArea 上的文本)

是否有单独使用 Swing 或必须应用 CSS 来实现此目的的解决方案?

编辑:

如果 swing 无法做到这一点,是否有以下标签的解决方案?

最佳答案

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 )

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

在您的情况下,您需要一个突然的渐变,其宽度是您要呈现的最长文本行的两倍。适本地移动它以获得渐变变化在您需要的文本位置。

关于java - 是否可以部分突出显示字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25647509/

相关文章:

java - 一旦我手动调整窗口大小,我的 JComponent 只会重新绘制(),如何让它正常工作?

java - 使用限定符注释的多个数据源总是返回错误的数据源

javascript - 如何通过透明的置顶菜单禁用查看元素

javascript - 为移动设备点赞和发送按钮

css - 如何使用伪元素隐藏 img 标签

java - 使用 wait() 动态更改组件背景颜色

java - 尽管使用 flowlayout,JFrame 组件仍能够通过 repaint 调用 PaintComponent

java - 电话 session iOS/android?

java - 删除单链表中的重复项保留顺序

java - 使用底部导航栏选项卡的不同背景颜色