Question

J'ai une classe Listner appelée TopicS J'essaie de l'appeler à partir d'une interface graphique appelée readMessages

Lorsque j'essaye d'exécuter la classe TopicS 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());
}                 

Cela me donne une erreur en disant

addTopicListner (java.lang.String) dans les rubriques Ne peut pas être appliqué à (java.lang.Object)

Lorsque je change la chaîne en objet, j'obtiens d'autres erreurs.La méthode principale est incluse ci-dessous, cela fonctionne bien sans GUI, mais je dois l'ajouter à GUI.Ce que j'essaie de faire, c'est de valoriser la zone de liste déroulante qui est un tableau de chaînes, et de 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();
  }
 }
}
Était-ce utile?

La solution

C'est parce que JComboBox.html.getSelectedItem () renvoie Object

public Object getSelectedItem()

Et votre méthode attend une chaîne

public void addTopicToListner(String t)

Si vous êtes sûr à 100% que le contenu de votre combobox est une 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 se compile pas même s'il est un objet String.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 est autre chose (un Date par exemple).

J'espère que cela vous aidera.

Autres conseils

JComboBox.getSelectedItem() renvoie le type Object, et non String.Vous pouvez appeler toString() sur son résultat pour renvoyer la représentation sous forme 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.

Essayez le code suivant

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

Ceci est une solution temporaire, car je ne sais pas si le getSelectedItem() entrant est un String.
Si vous savez que ce sera toujours juste de le lancer

(String)topicCombobox.getSelectedItem()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top