因此,我尝试通过从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
。这将导致精确的字体呈现为文本区域:
但这不适用于每个系统。从图形对象查询FontRenderContext
或最初指定的渲染提示只返回Default antialiasing text mode
,这不是用于渲染文本区域的模式。
所以我的问题是:如何从文本组件/ java系统中获取实际使用的抗锯齿模式?
注意:我没有尝试实现一个完全成熟的行编号编辑器,所以&#34;效率低下&#34;这个解决方案无关紧要。此外,在过去几年中,当我直接在组件的绘制方法中渲染文本时,我多次遇到过这个问题,所以这只是一个例子。
答案 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"
替换。