因此,我試圖通過從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系統中獲得實際使用的抗鋸齒模式?
注:我沒有試圖實現一個完全成熟的行編號編輯器,所以這種解決方案的「低效率」是無關緊要的。另外,在過去的幾年中,我直接在組件的繪畫方法中呈現文本時遇到過這個問題,所以這只是一個例子。
'getRenderingHints()'揭示了什麼適用? – trashgod
不,如問題中所述,它返回「文本特定的抗鋸齒啓用鍵=默認的抗鋸齒文本模式」。 – dosenfant
當我設置了抗鋸齒提示時,我得到一個條目「文本特定的抗鋸齒啓用鍵= LCD HRGB抗鋸齒文本模式」。 – trashgod