Я только что столкнулся с интересной вещью.
Я менял выбранный стиль текста. Дело в том, что когда я меняю стиль для ОДНОГО СЛОВА по одному, это нормально, но затем, если я выбираю целую стилизованную фразу и меняю цвет ее шрифта, вся фраза становится ОДНОЙ ( первый стиль в выделенном тексте ) только :(
Вот фрагмент проблемы
private void setFontColorStyle()
{
JTextPane editor=this.getTextPane();
String text=this.getTextPane().getSelectedText();
StyledDocument doc=(StyledDocument) editor.getDocument();
int selectionEnd=this.getTextPane().getSelectionEnd();
int selectionStart=this.getTextPane().getSelectionStart();
Element element=doc.getCharacterElement(selectionStart);
AttributeSet as = element.getAttributes();
String family = StyleConstants.getFontFamily(as);
int fontSize = StyleConstants.getFontSize(as);
boolean isBold=StyleConstants.isBold(as);
boolean isItalic=StyleConstants.isItalic(as);
boolean isUnderlined=StyleConstants.isUnderline(as);
StyleContext context = new StyleContext();
Style style;
this.getTextPane().replaceSelection("");
style = context.addStyle("mystyle", null);
style.addAttribute(StyleConstants.FontSize, fontSize);
style.addAttribute(StyleConstants.FontFamily, family);
style.addAttribute(StyleConstants.Foreground, this.fontColor);
style.addAttribute(StyleConstants.Bold, isBold);
style.addAttribute(StyleConstants.Italic, isItalic);
style.addAttribute(StyleConstants.Underline, isUnderlined);
this.getTextPane().replaceSelection("");
try {
this.getTextPane().getStyledDocument().insertString(selectionEnd - text.length(), text, style);
} catch (BadLocationException ex) {
}
}
А вот смелый код метода создания ... ()
Курсив и подчеркнута все та же логика, так что, я думаю, она вполне понятна
private void setFontBoldStyle()
{
if(this.getTextPane().getSelectedText()!=null)
{
String text = this.getTextPane().getSelectedText();
int selectionStart=this.getTextPane().getSelectionStart();
int selectionEnd=this.getTextPane().getSelectionEnd();
StyleContext context = new StyleContext();
Style style;
Element element=doc.getCharacterElement(selectionStart);
Enumeration en=doc.getStyleNames();
AttributeSet as = element.getAttributes();
/**
* Get style from history...
*/
String family = StyleConstants.getFontFamily(as);
int fontSize = StyleConstants.getFontSize(as);
Color currentColor=StyleConstants.getForeground(as);
boolean isBold=StyleConstants.isBold(as)?false:true;
boolean isItalic=StyleConstants.isItalic(as);
boolean isUnderlined=StyleConstants.isUnderline(as);
String styleName=String.valueOf(Math.random());
style = context.addStyle(styleName, null);
// style.addAttribute(StyleConstants.FontSize, fontSize);
// style.addAttribute(StyleConstants.FontFamily, family);
style.addAttribute(StyleConstants.Foreground, currentColor);
style.addAttribute(StyleConstants.FontFamily, family);
style.addAttribute(StyleConstants.FontSize, fontSize);
style.addAttribute(StyleConstants.Bold, isBold);
style.addAttribute(StyleConstants.Italic, isItalic);
style.addAttribute(StyleConstants.Underline, isUnderlined);
this.getTextPane().replaceSelection("");
try {
this.getTextPane().getStyledDocument().insertString(selectionEnd - text.length(), text, style);
} catch (BadLocationException ex) {
}
}//if end...
}
Вот код вызова метода, выделенный жирным шрифтом:
private void setFontBold()
{
this.setFontBoldStyle();
}
... и вызов метода цвета
private void setFontColor(Color fontColor)
{
this.fontColor=fontColor;
this.setFontColorStyle();
}
... и слушатели действий (жирным шрифтом) ...
private void boldButtonActionPerformed(java.awt.event.ActionEvent evt) {
this.getTextPane().requestFocusInWindow();
this.setFontBold();
}
... и для цвета
private void colorButtonActionPerformed(java.awt.event.ActionEvent evt) {
this.getTextPane().requestFocusInWindow();
ColorDialog colorEditor=new ColorDialog();
//returns rgb color...
Color color=colorEditor.getSelectedColor(this.getDialog(), true,false);
if(color==null){
JOptionPane.showMessageDialog(this.getDialog(), "null color");
return;
}
this.setFontColor(color);
}
Мне очень нужен ваш совет о том, как сохранить выбранные стили текста без изменений (например, жирный шрифт или семейство шрифтов), когда я хочу, например, изменить совершенно другой выбранный цвет текста в стилизованном виде?
Чтобы быть более понятным ...
Например, у меня есть текст
Мой Привет Мир это не красиво:)
Затем я выбираю всю фразу и меняю ее цвет с черного на красный. Следующий текст становится красным, но вся фраза становится жирной в соответствии с первым стилем. Но дело в том, что было бы интересно сохранить стили, выделенные жирным шрифтом и курсивом, но в то же время иметь фразу красного цвета :) Очень просто, но я только что запутался, как управлять несколькими стилями в рамках выделенной области текста?
Любой полезный комментарий приветствуется