2010-03-12 15 views
1

J'essaie de créer une fenêtre de discussion très simple qui a simplement la capacité d'afficher du texte, que j'ajoute de temps en temps. Cependant, je reçois l'erreur de temps d'exécution suivante lorsque vous tentez d'ajouter du texte à la fenêtre: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) 

Voici la classe pour gérer les opérations de base:

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

S'il existe un moyen plus simple de le faire , par tous les moyens laissez-moi savoir. J'ai seulement besoin que le texte soit d'un type de police unique, et non modifiable par l'utilisateur. En dehors de cela, je dois juste être en mesure d'ajouter du texte à la volée.

Répondre

2

Vous avez deux options:

  1. Conserver les JTextPane dans une variable membre et de retour qu'à l'intérieur getTextPane().
  2. Modifier getTextPane pour retourner la vue de JViewPort, comme celui-ci

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

Voir la Swing tutorials pour plus de détails.

En outre, comme camickr (et les tutoriels) a souligné, en utilisant add avec un JScrollPane est incorrect. Vous devez passer le composant au constructeur ou utiliser setViewportView.

En note, j'essaie de ne pas sous-classer les composants Swing à moins que ce ne soit absolument nécessaire (préférant la composition à l'héritage). Mais ce n'est pas particulièrement pertinent à la question.

+0

Je pense qu'il est une faute de frappe, devrait être 'getView()' 'non getViewportView()'. – JRL

+0

@JRL: Vous avez raison; J'ai juste supposé que les tutoriels de Swing l'avaient bien fait. Ce genre de mal à mon point de les lire. –

+0

Même si la faute de frappe est corrigée, le problème est que le volet de texte n'a pas été ajouté à la fenêtre, ce qui ne résoudra pas le problème. – camickr

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

this.getComponent(0) renvoie le JViewPort de ScrollPane, pas votre JTextPane. Il ne peut pas être casté, et ainsi vous obtenez votre exception.

+0

Cela peut corriger le problème indiqué, cependant, le panneau de défilement ne fonctionnera pas, car vous ne pouvez pas simplement ajouter le volet de texte. Vous devez ajouter le volet de texte à la fenêtre pour que cela fonctionne. Ensuite, je ne suis pas sûr si vous êtes assuré que le volet de texte sera le composant 0, car vous pourriez avoir des barres de défilement ou des en-têtes de ligne ajoutés au panneau de défilement. – camickr

+0

@camickr: Je pense que vous avez raison sur la partie 'setViewportView()', mais notez que je ne propose pas de correctif, juste en expliquant l'exception. – JRL

+0

Oui, je vois maintenant. – camickr

2

Ne pas étendre un JScrollPane. Vous N'ajoutez AUCUNE fonctionnalité à cela.

Il semble que le problème de base est que vous essayez d'ajouter le volet de texte au panneau de défilement. Ce n'est pas comme ça que ça fonctionne. Vous devez ajouter le volet de texte à la fenêtre. La façon facile de le faire est:

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

ou

scrollPane.setViewportView(textPane);