Java Einfache Chat Box
-
19-09-2019 - |
Frage
Ich versuche, ein sehr einfachen Chat-Fenster zu schaffen, dass einfach die Fähigkeit hat, einen Text anzuzeigen, die mich von Zeit zu Zeit hinzufügen. Ich erhalte jedoch die folgenden Laufzeitfehler, wenn auf append Text zum Fenster versucht:
java.lang.ClassCastException: javax.swing.JViewport cannot be cast to javax.swing.JTextPane
at ChatBox.getTextPane(ChatBox.java:41)
at ChatBox.getDocument(ChatBox.java:45)
at ChatBox.addMessage(ChatBox.java:50)
at ImageTest2.main(ImageTest2.java:160)
Hier ist die Klasse, die grundlegenden Operationen zu behandeln:
public class ChatBox extends JScrollPane {
private Style style;
public ChatBox() {
StyleContext context = new StyleContext();
StyledDocument document = new DefaultStyledDocument(context);
style = context.getStyle(StyleContext.DEFAULT_STYLE);
StyleConstants.setAlignment(style, StyleConstants.ALIGN_LEFT);
StyleConstants.setFontSize(style, 14);
StyleConstants.setSpaceAbove(style, 4);
StyleConstants.setSpaceBelow(style, 4);
JTextPane textPane = new JTextPane(document);
textPane.setEditable(false);
this.add(textPane);
}
public JTextPane getTextPane() {
return (JTextPane) this.getComponent(0);
}
public StyledDocument getDocument() {
return (StyledDocument) getTextPane().getStyledDocument();
}
public void addMessage(String speaker, String message) {
String combinedMessage = speaker + ": " + message;
StyledDocument document = getDocument();
try {
document.insertString(document.getLength(), combinedMessage, style);
} catch (BadLocationException badLocationException) {
System.err.println("Oops");
}
}
}
Wenn es ein einfacherer Weg, dies zu tun, mit allen Mitteln lassen Sie mich wissen. Ich brauche nur den Text eines einzelnen Schrifttyp zu sein, und nicht bearbeitet werden durch den Benutzer. Abgesehen davon, dass ich nur müssen in der Lage Text on the fly anhängen.
Lösung
Sie haben zwei Möglichkeiten:
- Speichern Sie die
JTextPane
in einer Membervariable und zurück, die innerhalbgetTextPane()
. -
Ändern
getTextPane
dieJViewPort
Ansicht zurückzukehren, wie diesreturn (JTextPane) getViewport().getView();
Siehe Swing-Tutorials für weitere Einzelheiten .
Auch als camickr (und die Tutorials) wiesen darauf hin, mit add
mit einem JScrollPane
ist falsch. Sie sollten entweder die Komponente an den Konstruktor oder mit setViewportView
.
Als Randbemerkung, ich versuche nicht zu Unterklasse Swing-Komponenten, wenn es absolut notwendig ist (Komposition der Vererbung bevorzugen). Aber das ist nicht besonders relevant für die Frage.
Andere Tipps
erstrecken sich nicht ein JScrollPane. Sie fügen keine Funktionalität zu.
Es sieht aus wie das grundlegende Problem ist, dass Ihr versuchen, den Textbereich auf die scrollpane hinzuzufügen. Das ist nicht so, wie es funktioniert. Sie müssen den Textbereich auf das Darstellungsfeld hinzuzufügen. Der einfache Weg, dies zu tun ist:
JTextPane textPane = new JTextPane();
JScrollPane scrollPane = new JScrollPane( textPane );
oder
scrollPane.setViewportView( textPane );
public JTextPane getTextPane() {
return (JTextPane) this.getComponent(0);
}
this.getComponent(0)
ist die JViewPort
der ScrollPane Rückkehr nicht Ihre JTextPane
. Es kann nicht gegossen werden, und so können Sie Ihre Ausnahme erhalten.