2010-03-12 3 views
1

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

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

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

ответ

2

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

  1. МАГАЗИНУ JTextPane в переменной-члена и вернуть что внутри getTextPane().
  2. Изменить getTextPane вернуться Открыть JViewPort «s, как этот

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

Swing tutorials Смотрите более подробно.

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

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

+0

Я думаю, что это опечатка, должно быть 'GetView()' 'не getViewportView()'. – JRL

+0

@JRL: Ты прав; Я просто предположил, что в учебниках Swing было все правильно. Такого рода болит мой смысл читать их. –

+0

Несмотря на то, что опечатка исправлена, проблема заключается в том, что текстовое поле не добавлено в окно просмотра, так что это не решит проблему. – camickr

1
public JTextPane getTextPane() { 
    return (JTextPane) this.getComponent(0); 
} 

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

+0

Это может устранить указанную проблему, однако scrollpane не будет работать, поскольку вы не можете просто добавить к ней текстовую панель. Вы должны добавить панель текста в область просмотра, чтобы она работала. Тогда я не уверен, что вам гарантировано, что текстовая панель будет компонентом 0, так как вы могли бы также добавить полосы прокрутки или заголовки строк в scrollpane. – camickr

+0

@camickr: Я думаю, что вы правы в части 'setViewportView()', но обратите внимание, что я не предлагаю исправление, просто объясняя исключение. – JRL

+0

Да, я вижу сейчас. – camickr

2

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

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

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

или

scrollPane.setViewportView(textPane);