免责声明:
特殊的KDB知识是不必要的。
我意识到有一些类似的问题,但没有一个解决方案对我有用。我在这里遇到类似问题的情况略有不同。
如果我错过了您需要的任何信息,我深表歉意。问我和我会给你尽可能多的信息。
我有一个包含3个类的Java应用程序,但只有2个是相关的,因为3rd是由kx创建的API,称为' Fusion'。
基本上,应用程序查询KDB数据库,该数据库每秒返回一个交易表的最后一行。该表不断被feed
修改。我让它返回最后一行,我将它打印到控制台。但我需要将其打印在JavaFX textField
或textArea
中。我创建Java GUI并不是那么出色,因为我的工作通常不需要我制作它们。我觉得这比听起来要难一点。
我的ConnectionToKDB
类负责打印到控制台,但我需要将它打印的内容发送到主类JavaFXToKDB
中的GUI。我一直在想必须有办法将控制台输出重定向到textfield
中的GUI组件JavaFXToKDB.java
。
另一个想法是将翻转代码的输出存储到字符串数组列表中,并使textfield
以某种方式访问它。我真的可以对此提出一些建议。控制台打印也发生在代码块中,您可以在其中看到我访问翻转功能并访问rows
和columns
。如果您想查看翻转函数,可以找到Fusion API here的类。
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import java.lang.*;
import javafx.geometry.Insets;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
public class JavaFxToKdb extends Application {
@Override
public void start(Stage primaryStage) {
TextField textfield = new TextField();
Button btn = new Button();
btn.setText("Show me the last Trade Record");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
VBox vbox = new VBox();
vbox.getChildren().addAll(textfield,btn);
vbox.setSpacing(10);
vbox.setPadding(new Insets(40,40,40,40));
Scene scene = new Scene(vbox, 600, 500);
primaryStage.setTitle("KDB Connector");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
/*
Instance of the class containing the method which connects to the KDB Process and queries the process table
*/
ConnectionToKDB varConnect = new ConnectionToKDB();
//varConnect.ConnectToKDB();
}
}
import java.io.IOException;
import java.util.Calendar;
public class ConnectionToKDB {
public ConnectionToKDB(){}
public void ConnectToKDB(){
//c connection = null;
// 1) create a java calendar instance
Calendar calendar = Calendar.getInstance();
// 2) get a java.util.Date from the calendar instance.
// this date will represent the current instant, or "now".
java.util.Date now = calendar.getTime();
// 3) a java current time (now) instance
java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(now.getTime());
try{
c connection=new c("localhost",6002,"admin:admin");
boolean run = true; //While true the application will continue to query the kdb process (RDB or TP depending on port)
while(run){
//System.out.println("Received "+ Arrays.deepToString(objectFeedArray));
//System.out.println("Recieved" + connection.k("-1#trade"));
/*
Prints the returned table row with column names and row data
*/
c.Flip flip = (c.Flip)connection.k("-1#trade");
for(int col=0;col<flip.x.length;col++)
System.out.print((col>0?",":"")+flip.x[col]);
System.out.println();
for(int row=0;row<c.n(flip.y[0]);row++){
for(int col=0;col<flip.x.length;col++)
System.out.print((col>0?",":"")+c.at(flip.y[col],row));
System.out.println();
}
//run = false;
Thread.sleep(1000); // Prevents duplicate rows produced due to querying the rdb multiple times before a new 'last row' was generated
//System.out.println(connection.k("2+4")); //Test connection to kdb process
}
//connection.close();
}
catch(c.KException ke){
System.out.println("Oops");
}
catch(IOException io){
System.out.println("Oops2");
}
catch(InterruptedException ie){
System.out.println("Oops3");
}
System.exit(0);
}
}