Вопрос

Я пытаюсь создать очень простое окно чата, в котором можно просто отображать текст, который я добавляю время от времени.Однако при попытке добавить текст в окно я получаю следующую ошибку времени выполнения:

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)

Вот класс для обработки основных операций:

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");
    }
}
}

Если есть более простой способ сделать это, обязательно дайте мне знать.Мне нужно, чтобы текст был одного типа шрифта и не редактировался пользователем.Помимо этого, мне просто нужно иметь возможность добавлять текст на лету.

Это было полезно?

Решение

У вас есть два варианта:

  1. Храните JTextPane в переменной-члене и вернуть ее внутри getTextPane().
  2. Изменить getTextPane вернуть JViewPortвзгляд, вот так

    return (JTextPane) getViewport().getView();
    

См. Учебники по свингу для более подробной информации.

Кроме того, как указал camickr (и учебные пособия), использование add с JScrollPane это неверно.Вы должны либо передать компонент конструктору, либо использовать setViewportView.

В качестве примечания: я стараюсь не создавать подклассы компонентов Swing, если это не абсолютно необходимо (предпочитаю композицию наследованию).Но это не имеет особого отношения к вопросу.

Другие советы

Не расширяйте JScrollPane.Вы НЕ добавляете к нему никаких функций.

Похоже, основная проблема заключается в том, что вы пытаетесь добавить текстовую панель в панель прокрутки.Это не так.Вам нужно добавить текстовую панель в область просмотра.Самый простой способ сделать это:

JTextPane textPane = new JTextPane();
JScrollPane scrollPane = new JScrollPane( textPane );

или

scrollPane.setViewportView( textPane );
public JTextPane getTextPane() {
    return (JTextPane) this.getComponent(0);
}

this.getComponent(0) возвращает ScrollPane JViewPort, Не твое JTextPane.Его нельзя применить, поэтому вы получаете исключение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top