6

我有一个名为TopicS的 Listner 类 我试图从名为 readMessages 的 gui 中调用它

当我尝试使用以下方法运行类 TopicS 时,

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

它给了我错误的说法

主题中的 addTopicListner(java.lang.String) 无法应用于 (java.lang.Object)

当我将字符串更改为对象时,我得到了其他错误。主要方法包含在下面,没有 GUI 也可以正常工作,但我需要将其添加到 GUI。我想要做的是对作为字符串数组的组合框取值,并将该字符串放入主题中(现在 (t) 所在的位置

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

3 回答 3

2

JComboBox.getSelectedItem()返回类型Object,不是String。您可以调用toString()其结果以返回对象的字符串表示形式。看起来好像您正在尝试返回一种类型Topic,这意味着您需要重写toString()on 方法Topic以返回您想要的值。

于 2011-03-23T20:09:04.320 回答
1

那是因为JComboBox.html.getSelectedItem()返回 Object

public Object getSelectedItem()

你的方法需要一个字符串

public void addTopicToListner(String t)

如果你 100% 确定你的组合框的内容是字符串,你只需要转换它:

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

就是这样。

此代码示例完全重现了您的编译错误:

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

    }

}

输出:

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

如您所见,即使最后一个调用 ( )一个 String 对象workWithString(o),它也不会编译。事实证明,编译器只知道被声明为,但它没有办法知道该对象是字符串还是其他东西(例如 a )。oObjectDate

我希望这有帮助。

于 2011-03-23T20:28:28.480 回答
0

试试下面的代码

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

这是一个临时修复,因为我不知道传入getSelectedItem()的是否为String.
如果你知道它总是会被施放

(String)topicCombobox.getSelectedItem()
于 2011-03-23T19:58:33.533 回答