我有一个需要格式化的文本,文本的第一个单词需要以粗体显示大字体并居中。
要进行此格式化我正在使用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);
}
}
任何帮助将不胜感激,并提前感谢您。
答案 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>");
这是不同部分的作用:
<html>
和</html>
:这些允许您使用所有其他html标记<center>
和</center>
:这些以tekst为中心<b>
和</b>
或<strong>
和</strong>
:这些会使文字变为粗体<font size=xx color=rbg(r,g,b)>
和</font>
:这些颜色的大小和颜色也可以使用预设颜色,如:color=black
此处还可以找到更多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);