Простое окно чата Java
-
19-09-2019 - |
Вопрос
Я пытаюсь создать очень простое окно чата, в котором можно просто отображать текст, который я добавляю время от времени.Однако при попытке добавить текст в окно я получаю следующую ошибку времени выполнения:
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");
}
}
}
Если есть более простой способ сделать это, обязательно дайте мне знать.Мне нужно, чтобы текст был одного типа шрифта и не редактировался пользователем.Помимо этого, мне просто нужно иметь возможность добавлять текст на лету.
Решение
У вас есть два варианта:
- Храните
JTextPane
в переменной-члене и вернуть ее внутриgetTextPane()
. Изменить
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
.Его нельзя применить, поэтому вы получаете исключение.