如何获得文本组件中使用的抗锯齿模式(底层系统/ OS设置)

时间:2017-07-16 12:05:05

标签: java swing paintcomponent antialiasing

因此,我尝试通过从JTextArea继承并覆盖paintComponent()来使用行号进行小型文本预览。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class PreviewPane extends JTextArea {

    public PreviewPane() {
        setText( "first row\nsecond row\nthird row" );
    }

    @Override
    protected void paintComponent( Graphics graphics ) {
        Graphics2D g = (Graphics2D) graphics;
        int emWidth = g.getFontMetrics().stringWidth( "m" );
        int lineHeight = g.getFontMetrics().getHeight();
        int baseLine = g.getFontMetrics().getAscent();

        g.translate( 2 * emWidth, 0 );
        super.paintComponent( g );

        g.translate( -2 * emWidth, 0 );

        g.setColor( getBackground() );
        g.fillRect( 0, 0, 2 * emWidth - 1, getHeight() - 1 );

        g.setColor( Color.LIGHT_GRAY );
        g.drawLine( 2 * emWidth - 1, 0, 2 * emWidth - 1, getHeight() - 1 );

        g.setColor( Color.BLACK );

        // "guessed" value for antialiasing
        g.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB );
        for ( int i = 1; i <= 3; i++ ) {
            g.drawString( String.valueOf( i ), getMargin().left, getMargin().top + baseLine + ( i - 1 ) * lineHeight );
        }
    }

    public static void main( String[] args ) {
        JFrame frame = new JFrame();
        frame.setBounds( 0, 0, 640, 480 );
        frame.getContentPane().add( new PreviewPane(), BorderLayout.CENTER );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setVisible( true );
    }
}

在标记的行中,我将抗锯齿提示设置为RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB。这将导致精确的字体呈现为文本区域:
Rendering with <code>RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB</code>

省略此行只使用默认值:
Rendering with default

但这不适用于每个系统。从图形对象查询FontRenderContext或最初指定的渲染提示只返回Default antialiasing text mode,这不是用于渲染文本区域的模式。

所以我的问题是:如何从文本组件/ java系统中获取实际使用的抗锯齿模式?

注意:我没有尝试实现一个完全成熟的行编号编辑器,所以&#34;效率低下&#34;这个解决方案无关紧要。此外,在过去几年中,当我直接在组件的绘制方法中渲染文本时,我多次遇到过这个问题,所以这只是一个例子。

1 个答案:

答案 0 :(得分:2)

通过Java lib源挖掘显示文本区域的字体呈现(可能还有其他文本组件)使用内部类sun.swing.SwingUtilities2。这将在内部保存所需信息,并从java.awt.Toolkit查询。

因此,从系统获取文本抗锯齿信息的代码是:

Toolkit tk = Toolkit.getDefaultToolkit();
Map map = (Map) tk.getDesktopProperty( sun.awt.SunToolkit.DESKTOPFONTHINTS );
g.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, map.get( RenderingHints.KEY_TEXT_ANTIALIASING ) );

地图的内容是(在我的情况下)

{Text-specific antialiasing enable key=LCD HRGB antialiasing text mode, Text-specific LCD contrast key=120}

这是所需的确切信息。

请注意,sun.awt.SunToolkit.DESKTOPFONTHINTS是禁止使用的API,因此应由"awt.font.desktophints"替换。