首页 > 编程语言 >仿微信聊天程序 - 03.登录界面

仿微信聊天程序 - 03.登录界面

时间:2023-07-16 13:45:07浏览次数:40  
标签:03 界面 登录 form void 仿微信 public stage

本文是仿微信聊天程序专栏的第三篇文章,主要记录了【登录界面】的实现。

界面设计

仿微信聊天程序的登录界面跟注册界面差不多,只是比注册界面少了一个昵称输入框,如下图所示:

界面布局

登录界面的界面布局和注册界面的布局差不多,也是使用fxml,采用VBox从上到下布局,中间的表单使用formsfx,预留一个StackPane给表单。

<VBox alignment="CENTER" prefHeight="300.0" prefWidth="480.0" spacing="10.0"
      stylesheets="@/css/bootstrapfx.css"
      xmlns:fx="http://javafx.com/fxml" fx:controller="michong.javafx.wx.view.login.LoginController">
    <children>
        <HBox alignment="CENTER_LEFT">
            <children>
                <Label text="登录" styleClass="h3,b"/>
                <Pane HBox.hgrow="ALWAYS"/>
                <Hyperlink text="注册" onAction="#onRegisterClick"/>
            </children>
            <padding>
                <Insets left="20.0" right="20.0"/>
            </padding>
        </HBox>
        <StackPane fx:id="formStackPane"/>
        <Button minWidth="120" text="登录" styleClass="btn-primary" onAction="#onLoginClick"/>
    </children>
    <padding>
        <Insets bottom="30.0" left="30.0" right="30.0" top="5.0"/>
    </padding>
</VBox>

表单构建

同样的表单构建也跟注册界面一样,只不过少了一个昵称的输入框:

/**
 * @author michong
 */
public class LoginForm {

    private final LoginVO vo = new LoginVO();
    private Form form;
    private FormRenderer renderer;

    private LoginForm() {
    }

    public static LoginForm getInstance() {
        LoginForm rf = new LoginForm();
        rf.build();
        return rf;
    }

    private void build() {
        // @formatter:off
        String username = "账号";
        String password = "密码";
        String placeholderTextFmt = "请输入%s";
        String requiredTextFmt = "%s必填";

        form = Form.of(
                Group.of(
                        Field.ofStringType(vo.usernameProperty())
                                .label(username)
                                .placeholder(String.format(placeholderTextFmt, username))
                                .required(String.format(requiredTextFmt, username)),
                        PasswordField.ofPasswordType(vo.passwordProperty())
                                .label(password)
                                .placeholder(String.format(placeholderTextFmt, password))
                                .required(String.format(requiredTextFmt, password))
                )
        );
        // @formatter:on
        renderer = new FormRenderer(form);
    }
}

事件处理

事件处理这里,要跟注册界面的跳转关联起来,在注册界面点击登录时,切换成登录界面,而在登录界面点击注册时,切换成注册界面:

public class LoginController implements Initializable {

    public StackPane formStackPane;
    private LoginForm form;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        initializeUI();
        initializeEvent();
    }

    void initializeUI() {
        form = LoginForm.getInstance();
        formStackPane.getChildren().add(form.getRenderer());
    }

    void initializeEvent() {
    }

    public void onRegisterClick(ActionEvent actionEvent) {
        formStackPane.getScene().setRoot(FXComponent.register());
    }

    public void onLoginClick(ActionEvent actionEvent) {
        form.getForm().persist();
        if (form.getForm().isValid()) {
            // FX.info(form.getVO().getUsername() + "登录成功", FXContext.getLoginStage());
            FXContext.getLoginStage().close();
            FXContext.getPrimaryStage().show();
        }
    }

}

更新注册页面点击登录的处理以及点击注册的处理:

public void onLoginClick(ActionEvent actionEvent) {
	formStackPane.getScene().setRoot(FXComponent.login());
}
public void onRegisterClick(ActionEvent actionEvent) {
	form.getForm().persist();
	if (form.getForm().isValid()) {
		FX.info(form.getVO().getUsername() + "注册成功", FXContext.getLoginStage());
		onLoginClick(actionEvent);
	}
}

登录窗口

登录和注册使用独立的窗口,登录成功后再显示住窗口,定制登录窗口:

public class LoginStage extends Stage {

    public static LoginStage build() {
        LoginStage stage = new LoginStage();
        stage.setTitle("米虫IM");
        stage.setScene(new Scene(FXComponent.login()));
        if (Platform.isSupported(ConditionalFeature.EFFECT)) {
            stage.initStyle(StageStyle.UNIFIED);
        }
        stage.getIcons().clear();
        stage.getIcons().add(FXIcon.logo());
        stage.setResizable(false);
        stage.setWidth(450);
        stage.setHeight(350);
        stage.initOwner(FXContext.getPrimaryStage());
        return stage;
    }

}

启动流程

调整启动流程,启动时显示登录窗口,不直接显示主窗口:

public class AppStarter {

    public static void start(Stage primaryStage) {
        FXContext.setPrimaryStage(primaryStage);

        BorderPane root = new BorderPane();
        root.setCenter(new Label("米虫IM"));
        primaryStage.setScene(new Scene(root));
        primaryStage.getIcons().clear();
        primaryStage.getIcons().add(FXIcon.logo());
        primaryStage.setResizable(false);
        primaryStage.setWidth(640);
        primaryStage.setHeight(480);

        LoginStage loginStage = LoginStage.build();
        FXContext.setLoginStage(loginStage);
        loginStage.show();
    }

}

标签:03,界面,登录,form,void,仿微信,public,stage
From: https://www.cnblogs.com/michong2022/p/17557753.html

相关文章

  • 仿微信聊天程序 - 04. 主界面
    本文是仿微信聊天程序专栏的第四篇文章,主要记录了【主界面】的实现。界面设计仿微信聊天程序的主界面总体跟微信的主界面差不多,但是比微信的主界面简单得多,如下图所示:界面布局主界面整个界面采用HBox布局,分为左中右三个部分,最左边是菜单栏,中间是联系人列表或对话信息列表,最右......
  • 仿微信聊天程序 - 05. 聊天列表
    本文是仿微信聊天程序专栏的第五篇文章,主要记录了【聊天列表】的界面实现。界面设计聊天列表在主界面左边,主要显示最近的聊天记录,以及添加好友的信息等,总体界面设计如下:界面布局聊天列表的布局分为两部,列表布局和列表中的每一行的布局,其中列表布局的完整fxml如下:<HBoxprefH......
  • 仿微信聊天程序 - 07. 好友信息
    本文是仿微信聊天程序专栏的第七篇文章,主要记录了【好友信息】的界面实现。界面设计这里的好友信息界面没有处理复杂的功能,仅仅显示好友信息,支持在此界面中发起聊天而已,总体的界面设计如下图所示:界面布局好友信息仅仅只是信息展示,布局相对比较简单,这里采用VBox和HBox组合使用......
  • 仿微信聊天程序 - 06. 好友列表
    本文是仿微信聊天程序专栏的第六篇文章,主要记录了【好友列表】的界面实现。界面设计好友列表在主界面左边,界面UI风格跟聊天列表类似,只不过相比聊天列表更加简单,不需要显示聊天信息,时间等,总体界面设计如下:界面布局跟好友列表一样,聊天列表的布局也分为两部,列表布局和列表中的每......
  • 仿微信聊天程序 - 08. 聊天窗口
    本文是仿微信聊天程序专栏的第八篇文章,主要记录了【聊天窗口】的界面实现。界面设计聊天窗口是整个聊天程序的核心控件,比较复杂,大致可以分为上中下三个部分,上面显示用户昵称以及一些操作菜单,中间是聊天内容显示区域,下面的信息发送的区域,总体界面设计如下:界面布局根据界面设计......
  • 20090316_為什麼輪迴很苦
    因果輪迴是一種工具、是公正無私的,而人是活生生的生命有長智慧的。人會對輪的害怕是來自對死亡的恐懼,不知道死後會去哪?會是怎樣的世界?死亡意味著剝奪你生前的所有。但是,佛法也要人們不思過去跟未來,遠離死後該去哪的煩惱。會害怕輪迴是因為人們認為那是要受苦的,也因為人們體會的......
  • lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /home/liuj
     glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于glibc囊括了几乎所有的 UNIX 通行的标准,可以想见其内容包罗万象。而......
  • 【雕爷学编程】Arduino动手做(06)---KY-038声音传感器模块4
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • python RuntimeError: populate() isn't reentrant
    PythonRuntimeError:populate()isn'treentrant在使用Python编程语言时,你可能会遇到一些错误和异常。其中之一是RuntimeError,它表示程序在运行时遇到了问题。在本文中,我们将讨论一个常见的RuntimeError,即“populate()isn'treentrant”。错误背景在理解这个错误之前,我们需要......
  • 【雕爷学编程】Arduino动手做(06)---KY-038声音传感器模块2
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......