JEditorKit color single chars without html - java

I want to mark parts of a jeditorpane content with a color, without using the html type content type. is there a way to accomplish this, maybe playing around with the document?

without using the html type content type
This means you have a plan text file and you should be using a JTextPane. Then you can use attributes to color the text.
JTextPane textPane = new JTextPane();
textPane.setText("Some text for the text pane.");
StyledDocument doc = textPane.getStyledDocument();
SimpleAttributeSet keyWord = new SimpleAttributeSet();
StyleConstants.setForeground(keyWord, Color.RED);
StyleConstants.setBackground(keyWord, Color.YELLOW);
StyleConstants.setBold(keyWord, true);
// Color existing text
doc.setCharacterAttributes(0, 5, keyWord, false);
// Add some text
try
{
doc.insertString(doc.getLength(), "\nEnd of text", keyWord );
}
catch(Exception e) { System.out.println(e); }

Related

How to preserve style of texts in JTextPane while append strings

Hi I have JTextPane and I want to load contents (text with font information) in different time. the appending text will always change in Font name or size or bold or italic. When I inserted new string(with diff fonts), TextPane always loosing font information of a previous loaded text. How to preserve font information always for a text pane? Also I want to insert images!! Do I have to use HtmlDocument for that? Any idea or suggestions are most welcome. Thanks in advance!! My code for JTextPane is,
textPane.setText("\n This is sample text editor ex");
styleDoc = textPane.getStyledDocument();
SimpleAttributeSet keyWord = new SimpleAttributeSet();
// set font information for new text
StyleConstants.setFontFamily(keyWord, fontName);
StyleConstants.setFontSize(keyWord, fontSize);
try {
styleDoc.insertString(0,
styleDoc.getText(0, styleDoc.getLength()), null);
styleDoc.insertString(styleDoc.getLength(), "ample", keyWord);
} catch (Exception e) {
e.printStackTrace();
}
Quick answer, for a quick question.
1) Use JTextPane.inserComponent or JTextPane.insertIcon to insert your images.
2) Use a StyledEditorKit to append your styled text. Remember that you can also use an HTMLDocument and HTMLEditorKit to handle html content.

JTextPane adding large spaces every time i insertString

Hey i'm making a chat application and was at first using a simple JTextPane for a basic, color supporting, chat view pane. I then wanted to add html link support to make them clickable by adding an HTML listener and setting the content type to text/html. The clickable links work perfectly, but now every time i insert a String the chat will add a large space. Here is the code i use below:
Constructor:
public JTextPaneTest() {
this.addHyperlinkListener(new LinkController());
this.setContentType("text/html");
this.setEditable(false);
}
Here is how i append regular text:
public void append(Color c, String s) {
SimpleAttributeSet sas = new SimpleAttributeSet();
StyleConstants.setForeground(sas, c);
StyledDocument doc = (StyledDocument)this.getDocument();
int len = getDocument().getLength();
try {
doc.insertString(len, s, sas);
} catch (BadLocationException e) {
e.printStackTrace();
}
setCaretPosition(len + s.length());
}
And Here is how i insertlinks
public void addHyperlink(URL url, String text) {
try {
Document doc = this.getDocument();
SimpleAttributeSet hrefAttr = new SimpleAttributeSet();
hrefAttr.addAttribute(HTML.Attribute.HREF, url.toString());
SimpleAttributeSet attrs = new SimpleAttributeSet();
attrs.addAttribute(HTML.Tag.A, hrefAttr);
StyleConstants.setUnderline(attrs, true);
StyleConstants.setForeground(attrs, Color.blue);
doc.insertString(doc.getLength(), text, attrs);
}
catch (BadLocationException e) {
e.printStackTrace(System.err);
}
}
For whatever reason with the content type set to just basic text, i don't get this space issue.
Here are some pictures of it:
http://i.stack.imgur.com/dpMBB.png
In the picture, the Name is inserted, then :, Then the rest of the text.
Edit: For whatever reason the JTextPane is automatically centering my InsertStrings.
Edit2: Is it possible to remove the margin between the HTML inserted strings? I've been trying everything for hours on end and simply can't find a solution. Only possible solution i can think of is reformatting the text via getText/setText every time i insert a string to insure no margins are added..
Instead of inserting text ith attribute try to create a dummy element and replace it with outer HTML containing th link
SimpleAttributeSet a=new SimpleAttributeSet();
a.addAttribute("DUMMY_ATTRIBUTE_NAME","DUMMY_ATTRIBUTE_VALUE");
doc.setCharacterAttributes(start, text.length(), a, false);
Element elem=doc.getCharacterElement(start);
String html="<a href='"+text+"'>"+text+"</a>";
doc.setOuterHTML(elem, html);
Se working example here
I ended up using just basic 'text' and using components for click detection.
To fix this issue i was having with HTML, i simply used
editorKit.insertHTML(doc, doc.getLength(), "html code", 0, 0, null);
Rather then inserting my code directly usings doc's 'insertString'

setContentType("text/html") for JTextPane doesn't work as it is expected

When you setContentType("text/html") it is applied only for the text that is set via JTextPane.setText(). All other text, that is put to the JTextPane via styles is "immune" to content type.
Here is what I mean:
private final String[] messages = {"first msg", "second msg <img src=\"file:src/test/2.png\"/> yeah", "<img src=\"file:src/test/2.png\"/> third msg"};
public TestGUI() throws BadLocationException {
JTextPane textPane = new JTextPane();
textPane.setEditable(false);
textPane.setContentType("text/html");
//Read all the messages
StringBuilder text = new StringBuilder();
for (String msg : messages) {
textext.append(msg).append("<br/>");
}
textPane.setText(text.toString());
//Add new message
StyledDocument styleDoc = textPane.getStyledDocument();
styleDoc.insertString(styleDoc.getLength(), messages[1], null);
JScrollPane scrollPane = new JScrollPane(textPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
//add scrollPane to the main window and launch
//...
}
In general, I have a chat that is represented by JTextPane. I receive messages from server, process them - set text color for specific cases, change smile markers to images path etc. everything is made within the bounds of HTML. But as it can be clearly seen from example above, only the setText is the subject of setContentType("text/html") and the second part, where new message added is represented by "text/plain" (if I'm not mistaken).
Is it possible to apply "text/html" content type to all data that is inserted to JTextPane? Without it, it is almost impossible to process messages without implemention of very complex algorithm.
I don't think you should be using the insertString() method to add text. I think you should be using something like:
JTextPane textPane = new JTextPane();
textPane.setContentType( "text/html" );
textPane.setEditable(false);
HTMLDocument doc = (HTMLDocument)textPane.getDocument();
HTMLEditorKit editorKit = (HTMLEditorKit)textPane.getEditorKit();
String text = "hyperlink";
editorKit.insertHTML(doc, doc.getLength(), text, 0, 0, null);
REEDIT
Sorry, I misunderstood the problem: inserting a string as HTML.
For that one needs to resort to the HTMLEditorKit capabilities:
StyledDocument styleDoc = textPane.getStyledDocument();
HTMLDocument doc = (HTMLDocument)styleDoc;
Element last = doc.getParagraphElement(doc.getLength());
try {
doc.insertBeforeEnd(last, messages[1] + "<br>");
} catch (BadLocationException ex) {
} catch (IOException ex) {
}
Here is a much simpler way to do that.
JTextPane pane = new JTextPane();
pane.setContentType("text/html");
pane.setText("<html><h1>My First Heading</h1><p>My first paragraph.</p></body></html>");

JTextPane make new line

I can make new lines using this code
StringBuilder sb = new StringBuilder();
sb.append("<span style=\"color:black\">--------------</span> <br>");
sb.append("<span style=\"color:red\">Error." + e.toString() + "</span> <br>");
sshoutput.setContentType("text/html");
sshoutput.setText(sb.toString());
but when I do this one more time with another text it only shows second text not after this
Error." + e.toString()
Sorry my English is not great. I hope you understand.
I'm working with JTextPane right now and what I do is:
JTextPane pane = new JTextPane();
StyledDocument doc = pane.getStyledDocument();
And so I can insert strings in any place using:
doc.insertString(STRING POSITION, STRING, null);
I have no exceptions with this method. There is also easy way to style letters using:
SimpleAttributeSet set = new SimpleAttributeSet();
//Here you modify set. Set is collection of
//various style instructions
//(letters color, bolded, italic, background color etc.)
//You modify set using StyleConstants class.
doc.setCharacterAttributes(START, LENGTH, set, true);
EDIT: An example, which creates text pane and writes in it styled 'Hello World':
JTextPane pane = new JTextPane();
StyledDocument doc = pane.getStyledDocument();
doc.insertString(0, "Hello", null);
SimpleAttributeSet set = new SimpleAttributeSet();
StyleConstans.setForeground(set, Color.RED);
doc.setCharacterAttributes(0, 5, set, true);
doc.insertString(5, "World!", null);
SimpleAttributeSet set = new SimpleAttributeSet();
StyleConstans.setForeground(set, Color.BLUE);
doc.setCharacterAttributes(5, 6, set, true);
Add it to a JPanel with GridLayout(1, 1) and you should see text pane with red string "Hello" and blue string "World" in it.

JTextPane appending a new string

In an every article the answer to a question "How to append a string to a JEditorPane?" is something like
jep.setText(jep.getText + "new string");
I have tried this:
jep.setText("<b>Termination time : </b>" +
CriterionFunction.estimateIndividual_top(individual) + " </br>");
jep.setText(jep.getText() + "Processes' distribution: </br>");
And as a result I got "Termination time : 1000" without "Processes' distribution:"
Why did this happen???
I doubt that is the recommended approach for appending text. This means every time you change some text you need to reparse the entire document. The reason people may do this is because the don't understand how to use a JEditorPane. That includes me.
I much prefer using a JTextPane and then using attributes. A simple example might be something like:
JTextPane textPane = new JTextPane();
textPane.setText( "original text" );
StyledDocument doc = textPane.getStyledDocument();
// Define a keyword attribute
SimpleAttributeSet keyWord = new SimpleAttributeSet();
StyleConstants.setForeground(keyWord, Color.RED);
StyleConstants.setBackground(keyWord, Color.YELLOW);
StyleConstants.setBold(keyWord, true);
// Add some text
try
{
doc.insertString(0, "Start of text\n", null );
doc.insertString(doc.getLength(), "\nEnd of text", keyWord );
}
catch(Exception e) { System.out.println(e); }
A JEditorPane, just a like a JTextPane has a Document that you can use for inserting strings.
What you'll want to do to append text into a JEditorPane is this snippet:
JEditorPane pane = new JEditorPane();
/* ... Other stuff ... */
public void append(String s) {
try {
Document doc = pane.getDocument();
doc.insertString(doc.getLength(), s, null);
} catch(BadLocationException exc) {
exc.printStackTrace();
}
}
I tested this and it worked fine for me. The doc.getLength() is where you want to insert the string, obviously with this line you would be adding it to the end of the text.
setText is to set all text in a textpane. Use the StyledDocument interface to append, remove, ans so on text.
txtPane.getStyledDocument().insertString(
offsetWhereYouWant, "text you want", attributesYouHope);

Categories

Resources