JTextPane中单词的居中对齐方式

时间:2014-06-25 11:16:55

标签: java styles alignment jtextpane

我有一个需要格式化的文本,文本的第一个单词需要以粗体显示大字体并居中。

要进行此格式化我正在使用JTextComponents的oracle教程中TextSamplerDemo.java的解决方案,解决方案工作得相当好,但是居中并不起作用!

现在我知道Stack Overflow已经有关于在JTextPane和other forums上对齐文本的答案,但它们都是关于对齐所有文本的解决方案,并且没有关于对齐一个单词或文本的一部分。

再次,字体,大小和"大胆" (不知道正确的术语,但你理解我的意思;-p)它们都有效,但是中心没有。

以下是我用来设置JTextPane的代码:

import java.awt.BorderLayout;
import java.text.SimpleDateFormat;
import java.util.Locale;
import javax.swing.JInternalFrame;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.StyledDocument;
import domain.Fiche_Employe;
import persistance.Lecture_Fiche;

public class Attestation extends JInternalFrame {

/**
 * Launch the application.
 */

/**
 * 
 */
private static final long serialVersionUID = 1L;
JTextPane attest;


/**
 * Create the frame.
 */
public Attestation(String mat) {
            //This a DataBase connection and data fetching
    Fiche_Employe fiche=new Fiche_Employe();
    Lecture_Fiche f=new Lecture_Fiche(mat, fiche);
    f.lire_fiche();

            //Frame Creation
            setBounds(100, 100, 450, 300);
    setVisible(true);   

            //Creation of the JtextPane 
    attest=createTextPane(fiche.getSociete(), fiche.getSexe(), fiche.getnom(), String.valueOf(fiche.getcnss()), new SimpleDateFormat("dd MMMMMMMMM yyyy", Locale.FRANCE).format(fiche.getDateEntree()), fiche.getQualification(),fiche.getCategorie(), fiche.getEchelon(), fiche.getSituationProf());
    getContentPane().add(attest, BorderLayout.CENTER); 



}

private JTextPane createTextPane(String code, String sexe, String nomPrenom, String cnss, String dateEntree, 
        String Qualif, String Categ, String ech, String SituatProf) {

    String civilite = null;
    String Societe;
    if (sexe.replaceAll("\\s+$", "").toLowerCase().equals("m"))
        civilite="Monsieur ";
    else if (sexe.replaceAll("\\s+$", "").toLowerCase().equals("f"))
        civilite="Madame ";
    if (code.replaceAll("\\s+$", "")=="200")
        Societe="text";
    else 
        Societe="text";


    String newline = "\n";
    String[] initString =
            { "ATTESTATION",            
            newline+newline+newline+"Nous soussignés, "+Societe+" attestons que Monsieur  ",                                   
              nomPrenom.replaceAll("\\s+$", ""),                                    
              ", immatriculé à la caisse Nationale de Sécurité Sociale sous le numéro  ",                                     
               cnss.replaceAll("\\s+$", ""),                                
              ", travaille dans notre société depuis le ",
              dateEntree+ "." + newline+newline,                                
              civilite,         //regular
              nomPrenom.replaceAll("\\s+$", ""),                                          
              " est employé actuellement en qualité de " +
              Qualif.replaceAll("\\s+$", "") + " "+
                SituatProf.replaceAll("\\s+$", ""),
                " catégorie "+Categ.replaceAll("\\s+$", ""),
                " échelon "+ech.replaceAll("\\s+$", ""),
                ", conformément à la Convention Collective Nationale de l’Industrie Laitière et Dérivés.",
                newline +newline,
                "Cette attestation est délivrée à l’intéressé, sur sa demande, pour servir et valoir ce que de droit."


             };

    String[] initStyles =
            { "centeredBold", "regular", "regular", "regular", "regular",
              "regular", "regular", "regular", "regular",
              "regular", "regular", "regular", "regular", "regular", "regular"
            };

    JTextPane textPane = new JTextPane();
    textPane.setContentType("text/html");
    textPane.setText("<html><center><b>  </b></center></html>");
    StyledDocument doc = textPane.getStyledDocument();

    addStylesToDocument(doc);

    try {
        for (int i=0; i < initString.length; i++) {
            doc.insertString(doc.getLength(), initString[i],
                             doc.getStyle(initStyles[i]));
        }
    } catch (BadLocationException ble) {
        System.err.println("Couldn't insert initial text into text pane.");
    }

    return textPane;
}

protected void addStylesToDocument(StyledDocument doc) {
    //Initialize some styles.
    Style def = StyleContext.getDefaultStyleContext().
                    getStyle(StyleContext.DEFAULT_STYLE);

    Style regular = doc.addStyle("regular", def);
    StyleConstants.setFontFamily(def, "Calibri");
    StyleConstants.setFontSize(regular, 16);

    Style s = doc.addStyle("italic", regular);
    StyleConstants.setItalic(s, true);

    s = doc.addStyle("bold", regular);
    StyleConstants.setBold(s, true);

    doc.addStyle("centeredBold", regular);
    SimpleAttributeSet center=new SimpleAttributeSet();
    StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
    StyleConstants.setBold(center, true);
    StyleConstants.setFontSize(center, 26);
    StyleConstants.setFontFamily(center, "Cambria");
    doc.getStyle("centeredBold").addAttributes(center);

    s = doc.addStyle("small", regular);
    StyleConstants.setFontSize(s, 10);

    s = doc.addStyle("large", regular);
    StyleConstants.setFontSize(s, 16);

    s = doc.addStyle("icon", regular);
    StyleConstants.setAlignment(s, StyleConstants.ALIGN_CENTER);



    s = doc.addStyle("button", regular);
    StyleConstants.setAlignment(s, StyleConstants.ALIGN_CENTER);



}


}

任何帮助将不胜感激,并提前感谢您。

3 个答案:

答案 0 :(得分:2)

你可以使用html来实现对象和颜色以及粗体:

首先,您需要将数据类型设置为html,如:

textarea.setContentType("tekst/html");

之后,您可以使用html格式来自定义外观:

例如,一个大字体,居中和粗体,你会这样做:

textarea.setText("<html><center><b><font size=30 color=rgb(1,1,1)>  Text   </font></b></center></html>");

这是不同部分的作用:

  1. <html></html>:这些允许您使用所有其他html标记
  2. <center></center>:这些以tekst为中心
  3. <b></b><strong></strong>:这些会使文字变为粗体
  4. <font size=xx color=rbg(r,g,b)></font>:这些颜色的大小和颜色也可以使用预设颜色,如:color=black
  5. 此处还可以找到更多HTML标记: http://www.w3schools.com/html/default.asp

    我希望这对您的代码有帮助并祝您好运:)。

    编辑:

    对于多种格式应用多个标记,标记仅在其被收集之前才有效。 所以我这样做:

    <html><font color=red>HI</font><font color=green>HI</font></html>.
    

    现在第一个HI是红色,第二个是绿色。所以你可以随意混合标签。因此,只有<center></center>之间的所有内容都居中。

    熟悉这里:

    <html><b>HI</b>HI</html>
    

    只有第一个HI是粗体,第二个是正常的。

    我希望这会更多地表现出来。

答案 1 :(得分:2)

  

但它们都是关于对齐所有文本的解决方案,并且没有关于对齐一个单词或文本的一部分。

您只能更改整行的对齐方式。没有理由你不能让一条线居中,另一条右对齐,另一条左对齐。您只需要更改要插入的文本(或已插入的文本)的段落属性。

您看到的示例显示了如何更改文档中当前所有文本的对齐方式,但这并不意味着您无法逐行更改对齐方式。

例如:

JTextPane textPane = new JTextPane();
textPane.setText( "this line is centered" );
StyledDocument doc = textPane.getStyledDocument();

//  Define paragraph (line) attributes

SimpleAttributeSet center = new SimpleAttributeSet();
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);

SimpleAttributeSet left = new SimpleAttributeSet();
StyleConstants.setAlignment(left, StyleConstants.ALIGN_LEFT);

// change all lines in the Document to be centered

doc.setParagraphAttributes(0, doc.getLength(), center, false);

// all newly added line will be left justified

doc.setParagraphAttributes(doc.getLength(),1 , left, false);

//  Add some text

try
{
    doc.insertString(doc.getLength(), "\newly added text is left justified", null );
}
catch(Exception e) {}
  

并且据我所知,Jtextpane支持格式更好的编辑窗格,

JEditorPane支持强大的HTML功能,但您需要将文本转换为HTML并创建所有HTML标记。我发现使用JTextPane将简单的文本和使用属性更容易编码和修改。

答案 2 :(得分:1)

您可以尝试手动居中。

计算单词的宽度并计算JTextPane的widht。然后获得额外的班次并将段落的左缩进设置为班次。

另一个可能更好的解决方案是将TabStop与ALIGN_CENTER一起使用。因此,您可以定义TabStop,其位置等于中心x,并将对齐设置为CENTER。然后在单词之前插入\ t char。

更新: TabStop澄清。

您可以定义TabSet段落属性。见StyleConstants

public static void setTabSet(MutableAttributeSet a, TabSet tabs)

TabSet具有构造函数

public TabSet(TabStop[] tabs)

然后参见TabStop构造函数

public TabStop(float pos, int align, int leader)

您可以在其中设置居中对齐

然后致电

doc.setParagraphAttributes(theAttrsWithTabSet);