Pregunta

He llamado una clase de Listner Temas Estoy tratando de llamarlo desde una GUI llamada ReadMessages

Cuando intento ejecutar los temas de clase usando el siguiente método,

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

Me da un error al decir

AddTopyListner (java.lang.string) en temas no se puede aplicar a (java.lang.object)

Cuando cambio la cadena a objeto, obtengo otros errores. El método principal se incluye a continuación, esto funciona bien sin GUI, pero necesito agregarlo a la GUI. Lo que estoy tratando de hacer es tomar valor a Combobox, que es una matriz de cadenas, y colocar esa cadena en el tema (donde (t) está ahora ahora

 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();
  }
 }
}
¿Fue útil?

Solución

Eso es porque JComboBox.html.getSelectedItem () Devuelve objeto

public Object getSelectedItem()

Y tu método espera una cadena

public void addTopicToListner(String t)

Si está 100% seguro de que el contenido de su comboBox está en cadena, solo tiene que lanzarlo:

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

Y eso es.

Esta muestra de código reproduce exactamente su error de compilación:

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

    }

}

Producción:

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

Como puede ver, la última llamada (workWithString(o) ) no se compila a pesar de que es un objeto de cadena. Resulta que el compilador solo sabe que o fue declarado como Object Pero no tiene una forma de saber si ese objeto es una cadena o es otra cosa (un Date por ejemplo ).

Espero que esto ayude.

Otros consejos

JComboBox.getSelectedItem() Tipo de devolución Object, no String. Puedes llamar toString() en su resultado para devolver la representación de cadena de su objeto. Parece que está tratando de devolver un tipo de Topic, lo que significa que deberá anular el toString() método sobre Topic Para devolver el valor que desea.

Prueba el siguiente código

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

Esta es una solución temporal, porque no sé si el entrante getSelectedItem() es un String.
Si sabes que siempre lo lanzará

(String)topicCombobox.getSelectedItem()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top