2011-03-23 3 views
3

Ive une classe Listner appelé Im essayant THÈMES de l'appeler d'un IUG appelé readMessages(java.lang.String) ne peut pas être appliqué à (java.lang.Object)

Lorsque Im essayant d'exécuter la classe tHÈMES en utilisant la méthode suivante,

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    System.out.println("test test test"); 
    System.out.print("you pressed" +topicCombobox.getSelectedItem()); 
    TopicS a = new TopicS(); 
    a.addTopicToListner(topicCombobox.getSelectedItem()); 
}     

Il me donne l'erreur en disant

addTopicListner(java.lang.String) in Topics Cannot be applied to (java.lang.Object)

Quand je change la chaîne à l'objet que je reçois d'autres erreurs. La méthode principale est incluse ci-dessous, cela fonctionne très bien sans interface graphique, mais j'ai besoin de l'ajouter à l'interface graphique. Ce que je suis en train de faire est de prendre de la valeur à combobox qui est un tableau String, et placer cette chaîne dans le sujet (où le (t) est maintenant

import java.util.Hashtable; 

import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.MessageListener; 
import javax.jms.Session; 
import javax.jms.TextMessage; 
import javax.jms.Topic; 
import javax.jms.TopicConnection; 
import javax.jms.TopicConnectionFactory; 
import javax.jms.TopicSession; 
import javax.jms.TopicSubscriber; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 

public class TopicS implements MessageListener 
{ 

private TopicConnection topicConnection; 
private TopicSession topicSession; 
public Topic topic; 
private TopicSubscriber topicSubscriber; 


public TopicS() 
      {} 
      public void addTopicToListner(String t){ 
    try 
    { 
    // create a JNDI context 
    Hashtable properties = new Hashtable(); 
    properties.put(Context.INITIAL_CONTEXT_FACTORY,"org.exolab.jms.jndi.InitialContextFactory"); 
    properties.put(Context.PROVIDER_URL,"rmi://localhost:1099/"); 
    Context context = new InitialContext(properties); 

    // retrieve topic connection factory 
    TopicConnectionFactory topicConnectionFactory = 
     (TopicConnectionFactory)context.lookup("JmsTopicConnectionFactory"); 
    // create a topic connection 
    topicConnection = topicConnectionFactory.createTopicConnection(); 

    // create a topic session 
    // set transactions to false and set auto acknowledgement of receipt of messages 
    topicSession = topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE); 

    // retrieve topic 
    topic = (Topic) context.lookup(t); 

    // create a topic subscriber and associate to the retrieved topic 
    topicSubscriber = topicSession.createSubscriber(topic); 

    // associate message listener 
    topicSubscriber.setMessageListener(this); 

    // start delivery of incoming messages 
    topicConnection.start(); 
    } 
    catch (NamingException e) 
    { 
    e.printStackTrace(); 
    } 
    catch (JMSException e) 
    { 
    e.printStackTrace(); 
    } 
} 

/* public static void main(String[] args) 
//{ 

    try 
    { 
    TopicS listener = new TopicS(); 
    Thread.currentThread().sleep(2000); 
    } 

    catch (InterruptedException e) 
    { 
    e.printStackTrace(); 
    } 
} 
*/ 
// process incoming topic messages 
public void onMessage(Message message) 
{ 
    try 
    { 
    String messageText = null; 
    if (message instanceof TextMessage) 
    messageText = ((TextMessage)message).getText(); 
    System.out.println(messageText); 
    } 
    catch (JMSException e) 
    { 
    e.printStackTrace(); 
    } 
} 
} 
+0

Le résultat de getSelectedItem est-il une chaîne? Si oui, pouvez-vous le lancer? – justkt

Répondre

1

C'est parce que JComboBox.html.getSelectedItem() retours objet

public Object getSelectedItem() 

Et votre méthode attend une chaîne

public void addTopicToListner(String t) 

Si vous êtes 100% que le contenu de votre combobox sont chaîne il vous suffit de le lancer:

a.addTopicToListner((String) topicCombobox.getSelectedItem()); 

Et c'est tout.

Cet exemple de code reproduit exactement votre erreur de compilation:

class StringAndObject { 
    public void workWithString(String s) {} // We just care about 
    public void workWithObject(Object o) {} // the signature. 

    public void run() { 

     String s = ""; // s declared as String 
     Object o = s; // o declared as Object 

     // works because a String is also an Object 
     workWithObject(s); 
     // naturally a s is and String 
     workWithString(s); 


     // works because o is an Object 
     workWithObject(o); 
     // compiler error.... 
     workWithString(o); 

    } 

} 

Sortie:

StringAndObject.java:19: workWithString(java.lang.String) in StringAndObject cannot be applied to (java.lang.Object) 
     workWithString(o); 
     ^
1 error 

Comme vous le voyez, le dernier appel (workWithString(o)) ne compile pas même si elle est une Objet de chaîne Il s'avère que le compilateur sait seulement que o a été déclaré comme Object mais il n'a pas de moyen de savoir si cet objet est une chaîne ou quelque chose d'autre (un Date par exemple).

J'espère que cela aide.

+0

Merci pour cela, cela a fonctionné parfaitement et une bonne explication aussi – skal

0

Essayez le code suivant

topicCombobox.getSelectedItem() instanceof String ? (String)topicCombobox.getSelectedItem() : "Socks"; 

C'est une solution temporaire, parce que je ne sais pas si l'entrée getSelectedItem() est un String.
Si vous le savez sera toujours juste le jeter

(String)topicCombobox.getSelectedItem() 
+0

La bonne façon de procéder: String.valueOf (topicCombobox.getSelectedItem()) – iluxa

+0

pourquoi 'String.valueOf' et non' .toString() '? – Riggy

+0

@Riggy: Pour une raison possible, 'String.valueOf' gère' null'. Je n'aime pas l'idée d'accepter silencieusement null. –

2

JComboBox.getSelectedItem() renvoie le type Object, et non String. Vous pouvez appeler toString() sur son résultat pour renvoyer la représentation de chaîne de votre objet. Il semble que vous essayez de renvoyer un type de Topic, ce qui signifie que vous devrez remplacer la méthode toString() sur Topic pour renvoyer la valeur souhaitée.

Questions connexes