2010-01-15 3 views
0

Java 및 JavaFX를 처음 사용하고 인스턴트 메시징을위한 Smack API를 처음 사용했습니다. 지금 자바 파일을 로그 아웃/재버 서버 (Openfire)에서 작동하고 메시지를 보내고 메시지를 수신합니다. 로그인/아웃 및 보내기 메시지는 javafx 파일에서 호출됩니다. 그러나, 나는 수신 메시지가 javafx에 표시되도록 고투하고있다. 나는 자바에서 콜백을 호출하기 위해 PacketListener를 확장하려고 시도했으나 이것이 똑같은지 클래스 자체에 적용되는지 확실하지 않다. 10, Y : 10 폭 : 390 신장 250 arcWidth 30 arcHeight 30 불투명도 1.0 채우이 LinearGradient { STARTX : 0.0 I이 사이트 http://blog.crisp.se/perlundholm/2009/02/28/1235815701880.htmlJava에서 Smack API (xmpp)로 JavaFX 콜백

/* 
* 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 가 ENDY 10.0 정지 : 정지 { 색상 : Color.BLACK 오프셋 : 0.0 }, { 정지,536,913,632 (10) 색 : Color.WHITE 오프셋 : 1.0 를} ] } } 아래

 VBox { 
     visible: true 
     content: bc 

    } 
    ] 
    } 
} 

가 채팅을 생성하고, 메시지를 전송하는 자바 파일에서 일부뿐만 아니라 메시지 리스너 시작 .

/* 
* 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); 
    } 
} 

Java JMS를 기반으로하는보다 철저한 예제는 Chapter 12 - JavaFX Code Recipes의 코드 예제를 다운로드하십시오.

둘째, 메인 이벤트 스레드에서 연결 등을해서는 안됩니다. 연결에 오랜 시간이 걸리면 GUI가 차단됩니다. 백그라운드에서 Java 연결 코드와 상호 작용하는 것이 더 좋습니다. 내 블로그 항목 http://blogs.oracle.com/clarkeman/entry/javafx_async_task을보고이를 수행하는 방법의 예를 확인하십시오.