2010-01-15 81 views
0

我是Java和JavaFX的新手,並且使用Smack API進行即時消息傳遞。在那一刻我有一個java文件在jabber服務器(Openfire)中登錄/退出,發送消息和接收消息。從javafx文件調用登錄/註銷和發送消息。但是,我正在努力讓收到的消息在javafx中顯示。我試圖擴展PacketListener來從java中調用回調函數,但我不確定這是否正確適用於類本身。 10 Y:10 寬度:390高度:250 arcWidth:30 arcHeight:30 不透明度:1.0 填充:的LinearGradient { STARTX:0.0 我曾在這個網站http://blog.crisp.se/perlundholm/2009/02/28/1235815701880.htmlJavaFX使用Smack API從Java回調(xmpp)

/* 
* stage.fx 
*/ 


package unfc; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.stage.StageStyle; 
import javafx.scene.paint.LinearGradient; 
import javafx.scene.paint.Stop; 
import javafx.scene.paint.*; 
import javafx.scene.layout.VBox; 
import javafx.scene.control.Button; 
import javafx.scene.paint.Color; 
import unfc.accordion; 
import javafx.scene.shape.Rectangle; 
import unfc.xmpp.xmpp_main; 
import javafx.scene.control.TextBox; 

import org.jivesoftware.smack.PacketListener; 
import org.jivesoftware.smack.packet.Message; 
import org.jivesoftware.smack.packet.Packet; 

class MucListener extends PacketListener { 

public var mediator: xmpp_main; 

override public function processPacket(packet: Packet) { 

    if (packet instanceof Message) { 
     var message: Message = packet as Message; 


     FX.deferAction(function(): Void { 

      mediator.xmpp_create_chat(message.getBody()); 

      }); 
    } 
    } 
} 


public class stage { 

public var getmsg: MucListener; 
public var test: VBox; 
public var test1: VBox; 
public var test2: VBox; 
public var message_new: TextBox; 
public var uj = accordion{}; 
public var xmpp = xmpp_main{}; 
public var content: javafx.scene.Node; 
public var content1: javafx.scene.Node; 
public var content2: javafx.scene.Node; 
public var testmsg = xmpp.msgArray; 


public var bc = VBox { 
      visible: true 
      spacing: 10 
      content: [ 

       test2 = VBox { 
        visible: true 
        width: 250 
        spacing: 10 
        content: [ 
          Button { 
          text: "Button" 
          action: function() {xmpp.xmpp_connect();} 
          }, 
        test = VBox { 
        visible: true 
        width: 250 
        spacing: 10 
        content: [content1,] 

        }, 
        ] 
       }, 

       VBox { 
        visible: true 
        width: 250 
        spacing: 10 

        content: [ 
          Button { 
          text: "Button1" 
          action: function() {xmpp.xmpp_disconnect();} 
          }, 
        test1 = VBox { 
        visible: true 
        width: 250  
        spacing: 10 

        content: [content2, 

        message_new = TextBox { 

          columns: 12 
          selectOnFocus: true 
            }, 

          Button { 
           text: "Send" 
           action: function() {xmpp.xmpp_create_chat(message_new.text); getmsg.mediator;} 
          } 


        ]}, 
        ] 
       }, 
      ] 
    } 

public var layout = Stage { 
title: "IM" 
style: StageStyle.TRANSPARENT 
resizable: false 
scene: Scene { 
    width: 500 
    fill: Color.TRANSPARENT 
    height: 400 

    content: [ 

    Rectangle { 

X得到了一些相關信息startY:0.0 endX:0.0 恩迪:10.0 停:[ 停止{ 顏色:Color.BLACK 偏移:0.0 }, 停止{ 顏色:Color.WHITE 偏移量:1.0 }, ] } },

 VBox { 
     visible: true 
     content: bc 

    } 
    ] 
    } 
} 

下面是從它創建聊天和發送一個消息java文件的部分以及啓動消息偵聽器。

/* 
* xmpp_connections.java 
* 
*/ 

package unfc.xmpp; 

import org.jivesoftware.smack.*; 
import org.jivesoftware.smack.packet.Message; 
import javafx.async.RunnableFuture; 

/** 
* @author Chris 
*/ 

public class xmpp_main { 

. 
. 
. 
. 
. 

    public void xmpp_create_chat(String msg) { 

    ChatManager chatmanager = connection.getChatManager(); 
    Chat newChat = chatmanager.createChat("[email protected]", new MessageListener() { 

     @Override 
     public void processMessage(Chat chat, Message message) { 
      //msgArray.add(new String("Received message: " + message.getBody())); 
      msgArray = "Received message: " + message.getBody(); 
      System.out.println("Received message: " + message); 



     } 


    }); 

    try { 
     newChat.sendMessage(msg); 
    } catch (XMPPException e) { 
     System.out.println("Error Delivering block"); 
    } 
} 

如果有人能指出我正確的方向,那將是很棒的。

回答

1

要將數據返回到JavaFX環境中,您需要設置Java接口並讓JavaFX類擴展該接口。但是,只能在主事件線程上操作JavaFX對象。爲此,您需要在JavaFX入口類上調用deferAction方法。這是一個例子。

public void onMessage(final Message msg) { 
    try { 
      // must run this on the JavaFX Main thread 
      // If you don't you will eventually get exceptions 
      // in the JavaFX code. 
      Entry.deferAction(new Runnable() { 
       @Override 
       public void run() { 
        fxListener.onMessage(msg); 
       } 
      }); 

    } catch (Exception ex) { 
      Logger.getLogger(Subscriber.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

下載爲Chapter 12 - JavaFX Code Recipes的代碼示例,基於Java的JMS更徹底的例子。

其次,你不應該在主事件線程中做連接等。如果連接需要很長時間,這會導致你的GUI阻塞。最好在後臺與Java連接代碼進行交互。看看我的博客條目http://blogs.oracle.com/clarkeman/entry/javafx_async_task,看看如何做到這一點的例子。