javaFX

Javafx程序ui的编写,首先要有一个舞台stage, 一个程序可以有多个舞台(如有两个舞台,表现为启动时有两个窗口),再在这个舞台上布置一个场景scence,同样,每个舞台可有多个场景,每一个场景对应显示器屏幕上的一个窗口,每个场景可以放节点,如按钮等,但不建议,应该是把节点放在面板中,再把面板放在场景中。各个节点在面板中的摆布又叫布局。所以ui的编程就是把多个节点接某种布局安排在面板中,再把面板放在场景中,再把场景关联到舞台中,最后舞台再show()出来。每一个窗口都要按这几步完成,除非你是在各个窗口中跳转,也就是在场景之间切换,就只写场景与舞台的关联两句。

我理解用javafx的难点不是ui部分,而是节点响应事件的编写部分,它的编写方法和逻辑顺序与在终端运行的纯java逻辑程序完全不同。

Ui图型部分因每个人的审美不同,各个节点组件的就摆放不同。

Javafx的事件相应有点象服务器在等待客户端的连接,如没有响应就一直等待哪里。如有多个响应事件,就好象处理多任务的感觉,这种情况又有点象NIO,和nio一样,javafx的start()方法又不是运行的多线路上,而是一个单线程。所以每个响应事件处理时间不能太长,更不应该处理无限循环事件。

某些节点如按钮,场景,都可以相应事件。这些都是前台响应事件,如不和客户直接交互的叫后台响应,如突发的异常等。

javafx 常用控件(节点node)

标签  Label           命令按钮 Button       单选按钮    RedioButton      文本框     TextField

文本区  TextArea       复选框   CheckBox        组合框   ComboBox      选择框    ChoiceBox

列表视图    ListView      表格视图   TableView         树视图  TreeView     选项卡 面板  TabPane

选项卡  Tab       微型选择器    Spinner       菜单条     MenuBar        菜单    Bar

菜单项   MenuItem        单选菜单按钮   RadioMenuItem    复选菜单按钮    CheckMenuItem

弹出菜单   ContextMenu         滚动条   ScrollBar      进度条     ProgressBar

滑动条     Slider     工具栏    ToolBar       工具提示      ToolTip

颜色选择器  ColorPicker       日期选择器  DatePicker    对话框   Dialog      超链接  Hyperlink

面板类型(节点布局)

StackPane     栈面板:节点叠加。

FlowPane   流式面板: 行排列或列排列

BoderPane 边界面板:屏幕分为上下左右中五部分

GridPane  网格面板:类似表格

HBox   单 行面板:  单行行排列

VBox   单列面板

text.setFont(Font.font("Verdana", FontWeight.BOLD,15));  如果控件不能显示中文,如按钮,文本框,就加上这句。Verdana 可省,直接写为 text.setFont(Font.font("",FontWeight.BOLD,15))  FontWeight有多种字体,可以选一种能显示的类型,后面的15是字的大小。
package org.example;

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.stage.Stage;
import javafx.util.Duration;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

import static org.example.Test.*;

public  class Test extends Application {
    public static String[] dir(String in){
        File file=new File(in);
        String[] out=file.list();
        return  out;
    }
    static String jpin="hello";
    static boolean isjp;
    static boolean isrun=true;
    static  boolean iszx;
    static  String pathfile="";
    static  boolean iscp;
    static String jspath="/home/wjs/nas/";
    static String s="start";
    static StringWriter sw=new StringWriter();
    static int t=0;
    @Override
    public void start(Stage stage){

        Label label=new Label();
        label.setFont(Font.font("Verdana", FontWeight.BLACK,15));
        label.setText("查询:dir,  上传:&+文件名,  下载:send,  聊天:直接输入");

        Button button=new Button();
        button.setPrefSize(120,50);
        button.setFont(Font.font("Verdana", FontWeight.BLACK,15));
        button.setText("发送");

        TextArea textArea=new TextArea();
        textArea.setPrefRowCount(24);
        textArea.setMaxHeight(410);
        textArea.setFont(Font.font("Verdana", FontWeight.BLACK,15));
        TextArea textArea1=new TextArea();

        textArea1.setMaxHeight(50);
        textArea1.setMaxWidth(600);
        textArea1.setFont(Font.font("Verdana", FontWeight.BLACK,15));

        EventHandler<ActionEvent> eventHandler1=event -> {
            jpin=textArea1.getText();
            sw.write("客户端发送:"+jpin+"\n");
            isjp=true;
            textArea1.setText("");
            t++;
        };

        button.setOnAction(eventHandler1);

        HBox hBox=new HBox();
        hBox.getChildren().addAll(textArea1,button);

        BorderPane root=new BorderPane();
        root.setTop(textArea);
        root.setCenter(label);
        root.setBottom(hBox);

        EventHandler<ActionEvent> eventHandler = e -> {
            textArea.setText(sw.toString());                                     //更新text内容
        };
        KeyFrame keyFrame=new KeyFrame(Duration.millis(100),eventHandler);   //每隔1ms相应一次eventHandler事件
        Timeline timeline = new Timeline(keyFrame);                            //ui定时显示static s的内容。
        timeline.setCycleCount(Timeline.INDEFINITE);
        timeline.play();

        Scene scene=new Scene(root,720,480);
        stage.setScene(scene);
        stage.setTitle("客户端");
        stage.show();
    }
    public  static void main(String[] args){
        Client t=new Client();
        t.start();
        launch(args);
    }
}
class Client extends Thread {
    public void run() {

        try {
            Socket sc = new Socket("114.132.48.228", 6001);
            InputStream is1 = sc.getInputStream();
            //------------接收服务器提示登录信息--------------------------------------------------
            ObjectInputStream objectInputStream1 = new ObjectInputStream(is1);
            //    System.out.println(objectInputStream1.readUTF());
            sw.write(objectInputStream1.readUTF()+"\n");
//----------判断对方服务器是否在线---------------------------------------------------
            boolean isrun = true;
            boolean iszx = objectInputStream1.readBoolean();
            if (iszx == true) {
                //    System.out.println("对方客户端在线");
                sw.write("对方客户端在线\n");
            } else {
                sw.write("对方客户端不在线\n");
                //       System.out.println("对方客户端不在线");
                while (iszx == false) {
                    Thread.sleep(1000);
                    iszx = objectInputStream1.readBoolean();
                }
            }
            //-------输入id验证id---------------------------------------------------------------
            //    System.out.println(objectInputStream1.readUTF());
            sw.write(objectInputStream1.readUTF()+"\n");
            OutputStream outputStreamid = sc.getOutputStream();
            ObjectOutputStream objectOutputStreamid = new ObjectOutputStream(outputStreamid);

       //     Scanner scanner = new Scanner((System.in));
            while(isjp==false){
                Thread.sleep(100);
            }

       //     objectOutputStreamid.writeUTF(scanner.nextLine());
            objectOutputStreamid.writeUTF(jpin);
            objectOutputStreamid.flush();

            sw.write(objectInputStream1.readUTF()+"\n");
            Jp jp = new Jp();
            jp.start();
//-------------------------------------------------------------------------------------
            while (iszx == true) {

                InputStream is = sc.getInputStream();
                ObjectInputStream objectInputStream = new ObjectInputStream(is);
                boolean isdf = objectInputStream.readBoolean();
                if (isdf == false) {
                    //           System.out.println("对方客户端离线,等待对方连线");
                    sw.write("对方客户端离线,等待对方连线\n");
                    Thread.sleep(3000);

                }
                char c = objectInputStream.readChar();
//-----------接收聊天信息---------------------------------------------------------------------
                if (c == '^') {
                    String s = objectInputStream.readUTF();
                    if (s.equals("&")) {
                        //     System.out.println("文件传输开始");
                        sw.write("文件传输开始\n");
                    } else {
                        //      System.out.println("客户端收到:" + s);
                        sw.write("客户端收到:" + s+"\n");
                        if (s.equals("dir")) {
                            //     String dirpath="/Users/wangzhong/nas/";
                            String[] dirfile = Test.dir(Test.jspath);
                            String stringout = "";
                            for (String x : dirfile) {
                                stringout = stringout + x + "    ";
                            }
                            Test.jpin = "\n" + stringout + "\n" + Test.jspath;
                            isjp = true;
                            isdf = true;
                        }
                        if (s.length() > 4) {
                            String zxml = s.substring(0, 4);

                            if (zxml.equals(("send"))) {
                                Test.pathfile = s.substring(5);
                                //    pathfile=jspath+pathfile;
                                Test.iscp = true;
                            }
                        }
                    }
                    c = '*';
                }

//------------接收对方客户端上传来的文件--------------------------------------------------------

                if (c == '&') {                //上传文件标志符
                    String jsfilename = objectInputStream.readUTF();
                    int jsfilelength = objectInputStream.readInt();
                    byte[] jsfile = new byte[jsfilelength];
                    objectInputStream.readFully(jsfile);

                    FileOutputStream fileOutputStream = new FileOutputStream(Client3000.jspath + jsfilename);
                    fileOutputStream.write(jsfile);
                    fileOutputStream.close();
                    //         System.out.println(jsfilename + "接收完成");
                    sw.write(jsfilename+"接收完成\n");
                    c = '*';
                }

                OutputStream os = sc.getOutputStream();
                ObjectOutputStream objectOutputStream = new ObjectOutputStream(os);
//-----------关闭程序---------------------------------------------------------------------
                if ((isjp == true) && (isdf == true)) {
                    if (Test.jpin.equals("~")) {
                        sc.close();
                        break;
                    }
                    //        if(!jpin.equals("&")) {
//---------发送聊天信息---------------------------------------------------------------------
                    objectOutputStream.writeChar('^');
                    objectOutputStream.flush();
                    objectOutputStream.writeUTF(Test.jpin);
                    objectOutputStream.flush();
                    System.out.println("客户端发送:" + Test.jpin);
                    isjp = false;
                    Test.iscp = false;
                    //          }
//-----------发送上传文件------------------------------------------------------------------
                } else if (Test.iscp == true) {
                    objectOutputStream.writeChar('&');    //发送上传文件标志符
                    objectOutputStream.flush();
                    try {
                        File file = new File(Test.jspath + Client3000.pathfile);
                        String filename = file.getName();
                        int filelength = (int) file.length();
                        objectOutputStream.writeUTF(filename);
                        objectOutputStream.writeInt(filelength);
                        objectOutputStream.flush();

                        byte[] fsfile = new byte[filelength];
                        FileInputStream fileInputStream = new FileInputStream(file);
                        fileInputStream.read(fsfile);

                        objectOutputStream.write(fsfile);
                        objectOutputStream.flush();
                        //         System.out.println(filename + "发送完成");
                        sw.write(filename + "发送完成\n");
                        Test.iscp = false;
                        isjp = false;
                    } catch (FileNotFoundException e) {
                        Test.s="复制文件路径错误";
                        break;
                    }

                } else {
//----------发送防阻塞符------------------------------------------------------------------
                    objectOutputStream.writeChar('*');
                    objectOutputStream.flush();

                }
                Thread.sleep(200);
            }
            sc.close();
            Test.s="客户端与服务器连接中断,重新连接";

        } catch (IOException | InterruptedException e) {
            Test.s="连接中断.重新启动程序";
            //    throw new RuntimeException(e);
        }
    }
}

//===========键盘输入类==========================================================
class Jp1 extends  Thread{
    public synchronized void run(){
        while(true) {
            Scanner scanner = new Scanner(System.in);
            Test.jpin = scanner.nextLine();
            isjp=true;

            if(Test.jpin.equals("&")){       //上传文件
                Test.pathfile=scanner.nextLine();
                Test.iscp=true;

            }
        }
    }
}
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;
public class App extends Application {

    static int n=0;
     public void start(Stage primaryStage) throws Exception {
         Text text=new Text();
         text.setX(50);
         text.setY(60);
         text.setFont(new Font(40));

         Group  group=new Group(text);
         EventHandler<ActionEvent> eventHandler = e -> {
             text.setText(String.valueOf(n));
         };

         KeyFrame keyFrame=new KeyFrame(Duration.millis(10),eventHandler);
         Timeline timeline = new Timeline(keyFrame);
         timeline.setCycleCount(Timeline.INDEFINITE);
         timeline.play();

         Scene scene = new Scene(group, 400, 200);
         primaryStage.setScene(scene);
         primaryStage.show();
     }
     public  static void main(String[] args) throws InterruptedException {
         Test3 test3=new Test3();
         test3.start();
         launch(args);
     }
}
class  Test3 extends Thread{
    public void run() {
        while (true) {
            App.n++;
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

========================================================================


import javafx.application.Application;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import java.io.IOException;

public class App extends Application {                            //javafx程序必须extend Application。
    @Override
    public void start(Stage stage) throws IOException {           //每个javafx只须编写start()方法,main()可省
        Button bt = new Button("an");
        Group root = new Group(bt);
        Scene scene = new Scene(root, 320, 240);
        stage.setTitle("Hello!");
        stage.setScene(scene);
        stage.show();                                              // 第一窗口,程序停留在此处等待,再相应事件的方法。

        EventHandler eventHandler = new EventHandler() {           //事件的发生主体可以是按键,也可以是场景scence。scence的事件类型非常多,如相应鼠标
            @Override
            public void handle(Event event) {                      //定义一个事件类型 eventHandler
                Text text = new Text();
                text.setX(0);
                text.setY(10);
                text.setText("sdnsadadao");
                Group root1 = new Group(text);
                Scene scene1 = new Scene(root1, 720, 480);
                stage.setScene(scene1);
                stage.show();                                              //第二窗口

                EventHandler eventHandler1 = new EventHandler() {
                    @Override
                    public void handle(Event event) {
                        stage.setScene(scene);
                        stage.show();                                      //从第二窗口跳回第一窗口,javafx窗口跳转原理是在主舞台stage中布置了多个场景scence,再为场景加上触发事件。
                    }
                };
                scene1.setOnMouseClicked(eventHandler1);                   //事件eventHandke1关联场景scence1,当鼠标键按下,触发事件 // 第一窗口
            }
        };
        bt.setOnAction(eventHandler);                             //事件enevtHandle关联按键bt.

    }
}
/*    public void stop() throws Exception {         //编写程序时,可省stop()和main()方法不写
        super.stop();
        System.out.println("over");
        System.exit(1);
    }
    public static void main(String[] args) {
        launch();                                   //启动App.start();程序结束时启动App.stop()方法
    }

}*/

1.下面是显示一张图片

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class HelloApplication extends Application {
    @Override public void start(Stage stage) throws FileNotFoundException {
        FileInputStream fi=new FileInputStream("/Users/wangzhong/1.jpeg");
        Image image = new Image(fi);
        ImageView iv1 = new ImageView(image);
        HBox box = new HBox();
        box.getChildren().add(iv1);
        Scene scene=new Scene(box,800,800);
        stage.setTitle("ImageView");
        stage.setScene(scene);
        stage.setMaximized(true);
        stage.show();
    }
    public static void main(String[] args) {
        launch();
    }
}

还是建议去看jdk,看书看的云里雾里的,上面的程序始终报错,看jdk才发现通过InputStream读取文件

2.通过按钮操作,程序从一个窗口跳转到另一个窗口:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javax.net.ssl.HttpsURLConnection;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
public class HelloApplication extends Application {
     @Override public void start(Stage stage) throws FileNotFoundException {
       FileInputStream fi1=new FileInputStream("/Users/wangzhong/1.jpeg");
       Image image1 = new Image(fi1);           //用InputStream 读取图片文件
        ImageView iv1 = new ImageView(image1);
        iv1.setFitWidth(490);
        iv1.setFitHeight(400);

        Label lb=new Label();
        lb.setFont(Font.font(240));


        iv1.setY(400);
        Button bt=new Button("读取");
        bt.setPrefHeight(50);
        bt.setPrefWidth(100);

        Button bt1=new Button("返回");
        bt1.setPrefHeight(50);
        bt1.setPrefWidth(100);

        Text text=new Text("读取https网页文件");
        text.setFont(Font.font(30));

        StackPane  sp=new StackPane();
        sp.getChildren().addAll(text);

        VBox vb=new VBox();
        vb.getChildren().addAll(bt,lb,bt1); //lb的作用是增加bt和bt1两个按钮之间的距离

        Text text1=new Text("wz@hbs  2022.12");
        text1.setFont(Font.font(10));

        BorderPane root=new BorderPane( );
        root.setTop(sp);          //Pane布局里可以镶嵌布局,此BorderPane Top顶部安排的是栈式布局sp,右边是VBox(vb).
        root.setLeft(iv1);
        root.setRight(vb);
        root.setBottom(text1);

        Scene scene=new Scene(root,600,450);    //可视窗口尺寸大小的设置
        stage.setTitle("javaFX");
        stage.setScene(scene);
        stage.show();

         bt.setOnAction(new EventHandler<ActionEvent>() {     //通过按钮,从一个窗口跳转到另一个窗口
             @Override
             public void handle(ActionEvent actionEvent) {
                 ReadHttp rh=new ReadHttp();                 //读取https网页
                 try {
                     text.setText(rh.read());
                 } catch (IOException e) {
                     throw new RuntimeException(e);
                 }
                 Group root=new Group(text);               //text 和 ImageView 可以用Group 布局

                  Scene scene1=new Scene(root,800,600);   //另开一窗口
                  stage.setScene(scene1);
                  stage.setMaximized(true);
                  stage.show();
             }
         });
    }
    public static void main(String[] args) {
        launch();
    }
}
class  ReadHttp{
    public  String  read() throws IOException {
        URL url=new URL("https://cn.bing.com");
        HttpsURLConnection  uc= (HttpsURLConnection) url.openConnection();
        InputStream is=uc.getInputStream();
        byte[] b=is.readAllBytes();
        String s=new String(b);
        return s;
    }
}

3. 通过按钮,在两个窗口之间来回切换,也可以通过这种方法,在多窗口中来回切换,主要是对Scene 场景的操作。一个舞台stage中可以有多个场景scene,通过对各个scene的操作来切换各种窗口

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import java.io.IOException;

public class HelloApplication extends Application {
    @Override
    public void start(Stage stage) throws IOException {
        Button bt=new Button("an");
        Group root=new Group(bt);
        Scene scene = new Scene(root, 320, 240);
        stage.setTitle("Hello!");
        stage.setScene(scene);                    //第一窗口
        stage.show();

        bt.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {

                Button bt1=new Button("java");
                StackPane root=new StackPane();
                root.getChildren().addAll(bt1);
                Scene scene1=new Scene(root,800,600);
                stage.setScene(scene1);                          //第二窗口
                stage.show();
                bt1.setOnAction(new EventHandler<ActionEvent>() {
                    @Override
                    public void handle(ActionEvent actionEvent) {
                        stage.setScene(scene);                         //切换回第一窗口
                         stage.show();

                    }
                });

            }
        });
    }

    public static void main(String[] args) {
        launch();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值