ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

GUI之JavaFX

2020-02-28 16:56:01  阅读:291  来源: 互联网

标签:primaryStage javafx GUI JavaFX scene new import public


  一、JavaFX不深究系列,目的只是为了尝试使用GUI的方式来生成桌面应用。

  二、JavaFX是一个强大的图形和多媒体处理工具包集合,它允许开发者来设计、创建、测试、调试和部署富客户端程序,并且和Java一样跨平台。说白了就是利用Java的跨平台关系,做了一个图形处理工具。

  三、详细学习可以参考:http://www.javafxchina.net/main/东西很多,不建议深究。

  四、来点基本案例:

  1)HelloWorld

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloWorld extends Application{

    public void start(Stage primaryStage) throws Exception {
        //按钮绑定事件
        Button button = new Button();
        button.setText("hello world");
        button.setOnAction(event -> System.out.println("hello world!!!"));

        StackPane stackPane = new StackPane();
        stackPane.getChildren().add(button);
        //大小
        Scene scene = new Scene(stackPane, 300, 500);

        //设置显示
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

  

  2)复杂一点,Login

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class Login extends Application{

    public void start(Stage primaryStage) throws Exception {

        GridPane gridPane = new GridPane();
        gridPane.setAlignment(Pos.CENTER);
        gridPane.setHgap(10);
        gridPane.setVgap(10);
//        gridPane.setPadding(new Insets(25, 25, 25, 25));

        Text welcome = new Text("Welcome");
        welcome.setFont(Font.font("Tahoma", FontWeight.BOLD, 20));
        welcome.setId("welcome");
        gridPane.add(welcome, 0, 0, 2, 1);

        Label username = new Label("UserName:");
        gridPane.add(username, 0, 1);

        Label password = new Label("Password:");
        gridPane.add(password, 0, 2);

        TextField userNameText = new TextField();
        gridPane.add(userNameText, 1, 1);

        TextField passwordText = new TextField();
        gridPane.add(passwordText, 1, 2);

        //一个按钮Node
        Button button = new Button("Login");
        //一层box,子元素按设置的10排列
        HBox hBox = new HBox(10);
        hBox.setAlignment(Pos.BASELINE_RIGHT);
        hBox.getChildren().add(button);
        gridPane.add(hBox, 1, 4);

        final Text text = new Text();
        gridPane.add(text, 0, 4, 2, 1);

        button.setOnAction(event -> {
            text.setFill(Color.RED);
            text.setText("login button pressed");
        });

        Scene scene = new Scene(gridPane, 400, 300);
        primaryStage.setTitle("Login");
        primaryStage.setScene(scene);
        scene.getStylesheets().add(Thread.currentThread().getContextClassLoader().getResource("example/css/login.css").toExternalForm());
        primaryStage.show();
    }

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

  

  3)Fxml的写法

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class LoginFxml extends Application{

    public void start(Stage primaryStage) throws Exception {
        Parent load = FXMLLoader.load(Thread.currentThread().getContextClassLoader().getResource("example/fxml/login.fxml"));
        Scene scene = new Scene(load, 400, 300);
        scene.getStylesheets().add(Thread.currentThread().getContextClassLoader().getResource("example/css/login.css").toExternalForm());
        primaryStage.setTitle("Login Fxml");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.text.Text?>
<GridPane xmlns="http://javafx.com/javafx"
          xmlns:fx="http://javafx.com/fxml"
          fx:controller="com.cetc.example.LoginController"
          hgap="10" vgap="10" alignment="CENTER">
    <padding>
        <Insets left="25" right="25" top="25" bottom="25"/>
    </padding>

    <Text
        fx:id="welcome"
        text="Welcome"
        GridPane.columnIndex="0"
        GridPane.rowIndex="0"
        GridPane.columnSpan="2"/>
    <Label
        text="UserName"
        GridPane.columnIndex="0"
        GridPane.rowIndex="1"/>
    <TextField
        GridPane.columnIndex="1"
        GridPane.rowIndex="1"/>
    <Label
        text="Password"
        GridPane.columnIndex="0"
        GridPane.rowIndex="2"/>
    <TextField
        GridPane.columnIndex="1"
        GridPane.rowIndex="2"/>
    <HBox alignment="BOTTOM_RIGHT" GridPane.columnIndex="1" GridPane.rowIndex="4">
        <Button text="Login" onAction="#loginHandler"/>
    </HBox>
    <Text GridPane.columnIndex="0" GridPane.rowIndex="4" GridPane.columnSpan="2" fx:id="loginView"/>
</GridPane>
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;


public class LoginController{

    @FXML
    private Text loginView;

    @FXML
    private void loginHandler(ActionEvent activeEvent) {
        loginView.setFill(Color.RED);
        loginView.setText("login button pressed");
    }

}

  五、上面是不是感觉特你妈复杂,html写着不好吗。所以html的写法才是最正确的写法,主要是方便

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class WebApplication extends Application {

    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Browser");
        Scene scene = new Scene(new Browser(), 900, 900);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

  注意:这里的方式采用的是浏览器的方式。

import javafx.application.Platform;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.layout.Region;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;

public class Browser extends Region {

    private WebView webView = new WebView();
    private WebEngine webEngine = webView.getEngine();

    public Browser() {

        Platform.runLater(() -> {
            webEngine.load(Thread.currentThread().getContextClassLoader().getResource("browser/index.html").toExternalForm());
        });
        getChildren().add(webView);
    }

    @Override
    protected void layoutChildren() {
        layoutInArea(webView, 0, 0, getWidth(), getHeight(), 0, HPos.CENTER, VPos.CENTER);
    }

    @Override
    protected double computePrefWidth(double height) {
        return 900;
    }

    @Override
    protected double computePrefHeight(double width) {
        return 900;
    }
}

  说明:这里的加载方式只能是静态页面的方式!当然可以加载已经部署好的web页面,不过那样就没啥意义了。

  最后写了一个html的例子,简单这里不弄源码了

  

 

  

   六、此篇源码地址:https://github.com/lilin409546297/JavaFX

  七:请参考官网学习地址:http://www.javafxchina.net/main/

 

标签:primaryStage,javafx,GUI,JavaFX,scene,new,import,public
来源: https://www.cnblogs.com/ll409546297/p/12377888.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有