【问题标题】:Java: How to enable text anti-aliasing in a JTextField?Java:如何在 JTextField 中启用文本抗锯齿?
【发布时间】:2011-12-21 09:01:14
【问题描述】:

这是我目前所拥有的,但该字段中的文本没有消除锯齿。我已经尝试用谷歌搜索它一段时间,但找不到任何讨论它的线程(令我惊讶的是)。有谁知道如何做到这一点?

public class SearchField extends JTextField{
    public SearchField(){
       super();
       this.setOpaque(false);
       this.setPreferredSize(new Dimension(fieldWidth, fieldHeight));
       this.setBorder(new EmptyBorder(4,8,4,8));
       this.setFont(fieldFont);
     }

    public void paintComponent(Graphics paramGraphics){
          Graphics2D g = (Graphics2D) paramGraphics;
          g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                             RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

          g.setColor(ColorConstants.LIGHT_GRAY);
          g.fillRoundRect(0,0,fieldWidth,fieldHeight,4,4);
          super.paintComponent(g);
     }
  }

【问题讨论】:

  • StackOverflow 上的这个问题可能会有所帮助:how to make JTextPane paint anti-aliased font?
  • g.fillRoundRect(0,0,fieldWidth,fieldHeight,4,4); 这听起来像是标准JTextField 上的custom border 的工作。
  • 如果一行简单的代码就可以解决问题并且足够高效,为什么还要使用自定义边框呢?但我必须承认,这是一个很好的观点。
  • 为什么要打扰,因为从长远来看,如果你跟随你正在使用的任何框架的风向(而不是绕道而行),你将是最有效率的。边界之风是......使用边界
  • 为什么不使用我们可以使用的工具来构建我们需要的组件呢?边框也只是另一个类,因此在这种情况下,RoundRectangle 的效率/后果可以很好地完成这项工作。不过不要争论——有很多方法可以做到。

标签: java swing fonts antialiasing


【解决方案1】:

我发现使用TextLayout 很有帮助,显示为here,因为可以同时使用isAntiAliasedusesFractionalMetrics 来调节FontRenderContext

示例中使用BufferedImage 纯属巧合。

【讨论】:

    【解决方案2】:

    这就是我决定做的事情,直到我找到一个更优雅的解决方案——效果很好。

    private class SearchField extends JTextField{
    
       private final int fieldWidth = 375;
       private final int fieldHeight = 30;
       private final Font fieldFont = FontLoader.getCustomFont("Gotham-Bold.ttf", 15);
       private final Color foreground = ColorConstants.SEARCH_FIELD_FOREGROUND;
       private final Color background = ColorConstants.SEARCH_FIELD_BACKGROUND;
    
       public SearchField(){
          super();
          this.setOpaque(false);
          this.setPreferredSize(new Dimension(fieldWidth, fieldHeight));
          this.setBorder(new EmptyBorder(5,5,5,5));
          this.setFont(fieldFont);
          this.setForeground(new Color(0,0,0,0));
          this.setSelectedTextColor(new Color(0,0,0,0));
       }
    
       @Override
       public void paintComponent(Graphics paramGraphics){
          Graphics2D g = (Graphics2D) paramGraphics.create();
          GraphicUtils.enableAntiAliasing(g); //RenderingHints
          g.setColor(background);
          g.fillRoundRect(0, 0, fieldWidth, fieldHeight, 4, 4);
          super.paintComponent(g);
          g.setColor(foreground);
          g.drawString(this.getText(), 5, 20);
       }
    }
    

    【讨论】:

    • 不确定 GraphicUtils 来自哪里,但对于该行,可以完成以下操作g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    • 这是我为应用各种RenderingHints而写的一个类,但谢谢。 :)
    猜你喜欢
    • 2014-08-21
    • 2021-05-20
    • 1970-01-01
    • 2022-08-17
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    相关资源
    最近更新 更多