Ja, ich nerve schon wieder
Diesmal isses was programmiertechnisches:
Ich habe ein JTextPane - darin will ich (für nen Chat) folgendes darstellen:
Username: Nachricht
Der Username soll dabei ein anklickbarer Link sein.
So, jetzt bin ich mal soweit ein JTextPane so formatiert zu haben, daß das möglich ist:
Die Usernames werden richtig angezeigt und reagieren auf den Listener
Aber die Nachricht daneben wird irgendwie zentriert dargestellt. Nach ein bisschen Spielerei bin ich drauf gekommen, daß (wahrscheinlich) die Links in <p>-Blöcke eingebunden werden. (siehe Bild)
Gibt es eine Möglichkeit das richtig zu formatieren (so, daß die Nachricht gleich nach dem Username kommt) ohne, daß ich von händischen HTML Tags Gebrauch machen muss ?
Und wenn es nicht anders geht: Wie formatiere ich die richtig ?
Ich suche schon seit Stunden das ganze Internet ab aber keiner hat irgendwas was brauchbar ist...
Danke
Diesmal isses was programmiertechnisches:
Ich habe ein JTextPane - darin will ich (für nen Chat) folgendes darstellen:
Username: Nachricht
Der Username soll dabei ein anklickbarer Link sein.
So, jetzt bin ich mal soweit ein JTextPane so formatiert zu haben, daß das möglich ist:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
/**
*
* @author Near
*/
public class DocumentTest {
private JFrame f;
private JTextPane jtp;
private HTMLDocument sd;
private SimpleAttributeSet as;
public DocumentTest() {
f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400, 400);
f.setLayout(new BorderLayout());
SimpleAttributeSet style = new SimpleAttributeSet();
StyleConstants.setForeground(style, Color.BLACK);
SimpleAttributeSet hrefAttr = new SimpleAttributeSet();
hrefAttr.addAttribute(HTML.Attribute.HREF, "#");
SimpleAttributeSet attrs = new SimpleAttributeSet();
attrs.addAttribute(HTML.Tag.A, hrefAttr);
StyleConstants.setUnderline(attrs, true);
StyleConstants.setForeground(attrs, Color.BLUE);
sd = new HTMLDocument();
jtp = new JTextPane();
jtp.setEditable(false);
jtp.setEditorKit(new HTMLEditorKit());
jtp.setFocusable(false);
jtp.setDocument(sd);
jtp.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent evt) {
if(evt.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
Element e = evt.getSourceElement();
try {
System.out.println("Element: "+e.getDocument().getText(0, e.getDocument().getLength()));
} catch(BadLocationException ex) {}
}
System.out.println("Link: "+evt.getEventType().toString());
}
});
f.add(jtp, BorderLayout.CENTER);
try {
sd.insertString(sd.getLength(), "Username", attrs);
sd.insertString(sd.getLength(), ": Nachricht\n", style);
sd.insertString(sd.getLength(), "Username", attrs);
sd.insertString(sd.getLength(), ": Das ist die zweite Nachricht\n", style);
} catch(BadLocationException ex) {
}
f.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
new DocumentTest();
}
}
Die Usernames werden richtig angezeigt und reagieren auf den Listener
Aber die Nachricht daneben wird irgendwie zentriert dargestellt. Nach ein bisschen Spielerei bin ich drauf gekommen, daß (wahrscheinlich) die Links in <p>-Blöcke eingebunden werden. (siehe Bild)
Gibt es eine Möglichkeit das richtig zu formatieren (so, daß die Nachricht gleich nach dem Username kommt) ohne, daß ich von händischen HTML Tags Gebrauch machen muss ?
Und wenn es nicht anders geht: Wie formatiere ich die richtig ?
Ich suche schon seit Stunden das ganze Internet ab aber keiner hat irgendwas was brauchbar ist...
Danke