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.

War es hilfreich?

Lösung

Sie haben zwei Möglichkeiten:

  1. Speichern Sie die JTextPane in einer Membervariable und zurück, die innerhalb getTextPane().
  2. Ändern getTextPane die JViewPort Ansicht zurückzukehren, wie dies

    return (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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top