我正在尝试创建一个非常简单的聊天窗口,它只能显示一些我不时添加的文本。但是,在尝试将文本附加到窗口时,我收到以下运行时错误:
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");
}
}
}
如果有更简单的方法,请务必告诉我。我只需要文本为单一字体类型,并且用户无法编辑。除此之外,我只需要能够即时附加文本。
答案 0 :(得分:2)
您有两种选择:
JTextPane
存储在成员变量中,并将其返回getTextPane()
。修改getTextPane
以返回JViewPort
的视图,就像这样
return (JTextPane) getViewport().getView();
有关详细信息,请参阅Swing tutorials。
此外,正如camickr(和教程)指出的那样,使用add
JScrollPane
是不正确的。您应该将组件传递给构造函数或使用setViewportView
。
作为旁注,我尽量不要将Swing组件子类化,除非它是绝对必要的(更喜欢组合而不是继承)。但这与问题并不特别相关。
答案 1 :(得分:2)
不要扩展JScrollPane。你没有添加任何功能。
看起来基本问题是您正在尝试将文本窗格添加到滚动窗格。这不是它的工作方式。您需要将文本窗格添加到视口。这样做的简单方法是:
JTextPane textPane = new JTextPane();
JScrollPane scrollPane = new JScrollPane( textPane );
或
scrollPane.setViewportView( textPane );
答案 2 :(得分:1)
public JTextPane getTextPane() {
return (JTextPane) this.getComponent(0);
}
this.getComponent(0)
正在返回ScrollPane的JViewPort
,而不是您的JTextPane
。它无法投放,所以你得到了例外。