6699856: Creating text in a JTextPane using Chinese text causes undesired behavior
Reviewed-by: peterz
This commit is contained in:
parent
8db0c57ad0
commit
755af2463d
@ -1125,6 +1125,7 @@ public class JEditorPane extends JTextComponent {
|
||||
* @param content the content to replace the selection with. This
|
||||
* value can be <code>null</code>
|
||||
*/
|
||||
@Override
|
||||
public void replaceSelection(String content) {
|
||||
if (! isEditable()) {
|
||||
UIManager.getLookAndFeel().provideErrorFeedback(JEditorPane.this);
|
||||
@ -1135,6 +1136,7 @@ public class JEditorPane extends JTextComponent {
|
||||
try {
|
||||
Document doc = getDocument();
|
||||
Caret caret = getCaret();
|
||||
boolean composedTextSaved = saveComposedText(caret.getDot());
|
||||
int p0 = Math.min(caret.getDot(), caret.getMark());
|
||||
int p1 = Math.max(caret.getDot(), caret.getMark());
|
||||
if (doc instanceof AbstractDocument) {
|
||||
@ -1150,6 +1152,9 @@ public class JEditorPane extends JTextComponent {
|
||||
getInputAttributes());
|
||||
}
|
||||
}
|
||||
if (composedTextSaved) {
|
||||
restoreComposedText();
|
||||
}
|
||||
} catch (BadLocationException e) {
|
||||
UIManager.getLookAndFeel().provideErrorFeedback(JEditorPane.this);
|
||||
}
|
||||
|
@ -170,6 +170,7 @@ public class JTextPane extends JEditorPane {
|
||||
*
|
||||
* @param content the content to replace the selection with
|
||||
*/
|
||||
@Override
|
||||
public void replaceSelection(String content) {
|
||||
replaceSelection(content, true);
|
||||
}
|
||||
@ -183,6 +184,7 @@ public class JTextPane extends JEditorPane {
|
||||
if (doc != null) {
|
||||
try {
|
||||
Caret caret = getCaret();
|
||||
boolean composedTextSaved = saveComposedText(caret.getDot());
|
||||
int p0 = Math.min(caret.getDot(), caret.getMark());
|
||||
int p1 = Math.max(caret.getDot(), caret.getMark());
|
||||
AttributeSet attr = getInputAttributes().copyAttributes();
|
||||
@ -197,6 +199,9 @@ public class JTextPane extends JEditorPane {
|
||||
doc.insertString(p0, content, attr);
|
||||
}
|
||||
}
|
||||
if (composedTextSaved) {
|
||||
restoreComposedText();
|
||||
}
|
||||
} catch (BadLocationException e) {
|
||||
UIManager.getLookAndFeel().provideErrorFeedback(JTextPane.this);
|
||||
}
|
||||
|
@ -4815,7 +4815,18 @@ public abstract class JTextComponent extends JComponent implements Scrollable, A
|
||||
new AttributedString(text, composedIndex, text.getEndIndex()));
|
||||
}
|
||||
|
||||
private boolean saveComposedText(int pos) {
|
||||
/**
|
||||
* Saves composed text around the specified position.
|
||||
*
|
||||
* The composed text (if any) around the specified position is saved
|
||||
* in a backing store and removed from the document.
|
||||
*
|
||||
* @param pos document position to identify the composed text location
|
||||
* @return {@code true} if the composed text exists and is saved,
|
||||
* {@code false} otherwise
|
||||
* @see #restoreComposedText
|
||||
*/
|
||||
protected boolean saveComposedText(int pos) {
|
||||
if (composedTextExists()) {
|
||||
int start = composedTextStart.getOffset();
|
||||
int len = composedTextEnd.getOffset() -
|
||||
@ -4830,7 +4841,15 @@ public abstract class JTextComponent extends JComponent implements Scrollable, A
|
||||
return false;
|
||||
}
|
||||
|
||||
private void restoreComposedText() {
|
||||
/**
|
||||
* Restores composed text previously saved by {@code saveComposedText}.
|
||||
*
|
||||
* The saved composed text is inserted back into the document. This method
|
||||
* should be invoked only if {@code saveComposedText} returns {@code true}.
|
||||
*
|
||||
* @see #saveComposedText
|
||||
*/
|
||||
protected void restoreComposedText() {
|
||||
Document doc = getDocument();
|
||||
try {
|
||||
doc.insertString(caret.getDot(),
|
||||
|
Loading…
Reference in New Issue
Block a user