Java 是否可以部分突出显示角色?

Java 是否可以部分突出显示角色?,java,css,swing,javafx,Java,Css,Swing,Javafx,有没有可能在Swing中实现这样的目标: 请注意,此处A部分着色 我知道单独使用DefaultHighlighter类是不可能的。 JTextArea上显示的文本 有什么解决方案可以单独在Swing中实现这一点,还是必须应用CSS 编辑: 如果swing无法实现这一点,那么任何带有以下标签的解决方案都可以使用JTextArea,但JTextArea不能。因此,您可以创建代码,在一个框架中呈现此内容,但我认为您不会找到一种简单的方法将此支持添加到文本编辑器中。嗯,您可以始终在文本编辑器中,但这可能

有没有可能在Swing中实现这样的目标:

请注意,此处A部分着色

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

有什么解决方案可以单独在Swing中实现这一点,还是必须应用CSS

编辑:


如果swing无法实现这一点,那么任何带有以下标签的解决方案都可以使用JTextArea,但JTextArea不能。因此,您可以创建代码,在一个框架中呈现此内容,但我认为您不会找到一种简单的方法将此支持添加到文本编辑器中。嗯,您可以始终在文本编辑器中,但这可能不是您想要的

[编辑]对于卡拉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);
  }

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


在本例中,需要一个突然的渐变,其宽度是要渲染的最长文本行的两倍。适当地移动它,以在需要的文本位置获得渐变变化。

类似的操作可以使用JTextArea,但不能使用JTextArea。因此,您可以创建代码,在一个框架中呈现此内容,但我认为您不会找到一种简单的方法将此支持添加到文本编辑器中。嗯,您可以始终在文本编辑器中,但这可能不是您想要的

[编辑]对于卡拉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);
  }

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


在本例中,需要一个突然的渐变,其宽度是要渲染的最长文本行的两倍。适当地移动它,以便在需要的文本位置获得渐变效果。

我认为这是不可能的,即使使用CSS也是如此。也许你必须生成一个图像,我认为这是做不到的,即使使用CSS。也许你必须生成一张我已经想到过的2D图像,但这对于逻辑来说太复杂了。也许我应该编辑标签。我不明白你说的对于逻辑来说太复杂是什么意思。只需从文本中获取一条路径加上一个颜色范围,然后使用该路径作为剪辑区域填充一个矩形?这有点像卡拉OK播放器。如果我采用这种解决方案,我可能会失去同步。计时调整到纳秒精度。滚动也会是一种痛苦。也许你会更好地理解,一旦你看到我原来的“X”问题:我不知道你怎么会失去同步,或者为什么会滚动。只需显示歌词的当前行,也许还有下一行。那样的话,歌手只需要水平移动他们的眼睛。我已经想到了2D,但是对于逻辑来说,这将是一种复杂的方式。也许我应该编辑标签。我不明白你说的对于逻辑来说太复杂是什么意思。只需从文本中获取一条路径加上一个颜色范围,然后使用该路径作为剪辑区域填充一个矩形?这有点像卡拉OK播放器。如果我采用这种解决方案,我可能会失去同步。计时调整到纳秒精度。滚动也会是一种痛苦。也许你会更好地理解,一旦你看到我原来的“X”问题:我不知道你怎么会失去同步,或者为什么会滚动。只需显示歌词的当前行,也许还有下一行。这样,歌手只需水平移动他们的眼睛。