2017-07-16 88 views
1

因此,我試圖通過從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系統中獲得實際使用的抗鋸齒模式?

注:我沒有試圖實現一個完全成熟的行編號編輯器,所以這種解決方案的「低效率」是無關緊要的。另外,在過去的幾年中,我直接在組件的繪畫方法中呈現文本時遇到過這個問題,所以這只是一個例子。

+0

'getRenderingHints()'揭示了什麼適用? – trashgod

+0

不,如問題中所述,它返回「文本特定的抗鋸齒啓用鍵=默認的抗鋸齒文本模式」。 – dosenfant

+0

當我設置了抗鋸齒提示時,我得到一個條目「文本特定的抗鋸齒啓用鍵= LCD HRGB抗鋸齒文本模式」。 – trashgod

回答

0

挖掘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"

相關問題