JTextArea和JtextPane中文本的对齐方式

时间:2014-05-26 10:41:10

标签: java swing alignment jtextarea jtextpane

我有一段代码,它使用 JTextArea 来显示一些文字,

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.text.DefaultCaret;

public class TextPane extends JFrame{
    public static TextPane instance;
    //private static JTextPane pane = new JTextPane(); //Uncomment to see alignment issue
    private static JTextArea pane = new JTextArea(); // alignment works fine
    private static JScrollPane scroll = new JScrollPane();
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                TextPane.getInstance().init();
            }
        });
    }
    private static TextPane getInstance() {
        if(null == instance){
            instance =  new TextPane();
        }
        return instance;
    }    
    private void init() {
        pane.setFont(new Font("Courier new", Font.PLAIN, 12)); 
        pane.setLayout(new BorderLayout());
        pane.setFocusCycleRoot(true);
        pane.setFocusTraversalKeysEnabled(false);
        pane.setBackground(Color.black);
        pane.setForeground(Color.white);
        pane.setCaretColor(Color.green);
        pane.setDragEnabled(false);
        pane.setText("IOC_CONFUG_MMM.lag    hkess.lag\t\t     papdifs.lag\r\nMemSys.lag.txt\t      eol.lag1\t\t     papdifs.lag2\r\nopp.lag\t\t      eol.lag2\t\t     papm_by.lag1\r\n");
        DefaultCaret caret = (DefaultCaret) pane.getCaret();
        caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
        scroll.setViewportView(pane);
        add(scroll);     
        setTitle("Test");
        setSize(800 , 800);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(true);
        setVisible(true);
    }
}

最初对齐setText字符串存在问题,但是在我添加字体为 Courier New 之后我解决了它(如果我删除 setFont 对齐将无效。 )

最近由于一些要求我从 JtextArea 更改为 JTextPane ,现在使用相同的代码,文本在JTextPane中没有正确对齐但如果我将其更改为JTextArea对齐工作正常。

我无法理解这种行为。如何在JTextPane中实现对齐。请帮忙。

1 个答案:

答案 0 :(得分:3)

JTextPane(或您隐式使用的编辑器工具包)有关于制表符放置的不同默认行为,这是因为它旨在包含比JTextArea更复杂的内容。您可以手动创建所需的简单固定宽度字体选项卡位置并显式设置。只需在setText(…);上调用pane之前插入以下行:

int w=pane.getFontMetrics(pane.getFont()).charWidth(' ');
TabStop[] stops={ new TabStop(0), new TabStop(w*8), new TabStop(w*16),
  new TabStop(w*24), new TabStop(w*32), new TabStop(w*40), new TabStop(w*48),
  new TabStop(w*56), new TabStop(w*64), new TabStop(w*72), new TabStop(w*80) };
MutableAttributeSet attrs=new SimpleAttributeSet();
StyleConstants.setTabSet(attrs, new TabSet(stops) );
pane.setParagraphAttributes(attrs, false);