修改登录框

This commit is contained in:
liwen
2020-11-06 11:37:17 +08:00
parent 849bcf53f4
commit 4c1f83f311
18 changed files with 903 additions and 69 deletions

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

@@ -2,6 +2,7 @@ package com.epri.fx.client;
import com.epri.fx.client.gui.uicomponents.control.LFXDecorator;
import com.epri.fx.client.gui.uicomponents.login.LoginController;
import com.epri.fx.client.gui.uicomponents.login.LoginControllerNew;
import com.epri.fx.client.store.ApplicatonStore;
import com.jfoenix.assets.JFoenixResources;
import com.jfoenix.svg.SVGGlyph;
@@ -69,7 +70,7 @@ public class AppStartup extends Application {
ApplicationContext.getInstance().register(stage, Stage.class);
Flow flow = new Flow(LoginController.class);
Flow flow = new Flow(LoginControllerNew.class);
FlowHandler flowHandler = flow.createHandler();
StackPane rootPane = flowHandler.start(new AnimatedFlowContainer(Duration.millis(320), ContainerAnimations.SWIPE_LEFT));
@@ -87,7 +88,7 @@ public class AppStartup extends Application {
stage.show();
scene.getStylesheets().addAll(JFoenixResources.load("/css/app-fonts.css").toExternalForm(),AppStartup.class.getResource("/css/app.css").toExternalForm());
scene.getStylesheets().addAll(JFoenixResources.load("/css/app-fonts.css").toExternalForm(),AppStartup.class.getResource("/css/app.css").toExternalForm(),AppStartup.class.getResource("/css/login.css").toExternalForm());
}

View File

@@ -0,0 +1,478 @@
package com.epri.fx.client.gui.uicomponents.login;
import com.epri.fx.client.bean.MenuVoCell;
import com.epri.fx.client.gui.uicomponents.main.MainController;
import com.epri.fx.client.request.Request;
import com.epri.fx.client.request.feign.admin.MenuFeign;
import com.epri.fx.client.request.feign.login.LoginFeign;
import com.epri.fx.client.store.ApplicatonStore;
import com.epri.fx.client.utils.AlertUtil;
import com.epri.fx.client.websocket.Session;
import com.epri.fx.server.util.EncryptUtil;
import com.epri.fx.server.util.user.JwtAuthenticationRequest;
import com.epri.fx.server.vo.FrontUser;
import com.epri.fx.server.vo.MenuVO;
import com.epri.fx.server.vo.PermissionInfo;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXPasswordField;
import com.jfoenix.controls.JFXProgressBar;
import com.jfoenix.controls.JFXTextField;
import com.jfoenix.svg.SVGGlyph;
import com.jfoenix.svg.SVGGlyphLoader;
import io.datafx.controller.ViewController;
import io.datafx.controller.flow.FlowException;
import io.datafx.controller.flow.action.ActionMethod;
import io.datafx.controller.flow.action.ActionTrigger;
import io.datafx.controller.flow.context.ActionHandler;
import io.datafx.controller.flow.context.FXMLViewFlowContext;
import io.datafx.controller.flow.context.FlowActionHandler;
import io.datafx.controller.flow.context.ViewFlowContext;
import io.datafx.controller.util.VetoException;
import io.datafx.core.concurrent.ProcessChain;
import javafx.animation.*;
import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Hyperlink;
import javafx.scene.control.Label;
import javafx.scene.effect.PerspectiveTransform;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.util.Duration;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import java.io.File;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @description:
* @className: ConversationItemPresenter
* @author: liwen
* @date: 2019-09-25 16:51
*/
@ViewController("/fxml/login/Untitled.fxml")
public class LoginControllerNew {
@FXML
private StackPane rootPane;
@FXML
private Pane imagePane;
@FXML
private StackPane centerPane;
//正面视图
@FXML
public HBox loginPane;
//反面视图
@FXML
public HBox registeredPane;
@FXML
public Hyperlink registeredLink;
@FXML
public Hyperlink loginLink;
@FXML
private Label errorLabel;
@FXML
private Label userIcon;
@FXML
private Label pwdIcon;
@FXML
private Label reuserIcon;
@FXML
private Label repwdIcon;
@FXML
private Label repwd2Icon;
@FXML
private JFXProgressBar lodingBar;
@FXML
private JFXTextField userNameTextField;
@FXML
private JFXPasswordField passWordTextField;
//翻转角度
private DoubleProperty angleProperty = new SimpleDoubleProperty(Math.PI / 2);
//正面翻转特效
private PerspectiveTransform frontEffect = new PerspectiveTransform();
//反面翻转特效
private PerspectiveTransform backEffect = new PerspectiveTransform();
private Timeline frontTimeLine = new Timeline();
private Timeline backTimeLine = new Timeline();
@ActionHandler
private FlowActionHandler actionHandler;
private SequentialTransition sequentialTransition = new SequentialTransition();
private DoubleProperty imageWidth = new SimpleDoubleProperty();
private DoubleProperty imageHeiht = new SimpleDoubleProperty();
@Inject
private Session session;
@FXML
@ActionTrigger("login")
private JFXButton loginBut;
@FXMLViewFlowContext
private ViewFlowContext flowContext;
@PostConstruct
public void init() {
try {
SVGGlyph userSvg = SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".user-name");
SVGGlyph pwdSvg = SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".password");
SVGGlyph reuserSvg = SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".user-name");
SVGGlyph repwdSvg = SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".password");
SVGGlyph repwd2Svg = SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".querenmima");
userSvg.setId("login-svg-glyph");
pwdSvg.setId("login-svg-glyph");
reuserSvg.setId("login-svg-glyph");
repwdSvg.setId("login-svg-glyph");
repwd2Svg.setId("login-svg-glyph");
userIcon.setGraphic(userSvg);
pwdIcon.setGraphic(pwdSvg);
reuserIcon.setGraphic(reuserSvg);
repwdIcon.setGraphic(repwdSvg);
repwd2Icon.setGraphic(repwd2Svg);
} catch (Exception e) {
e.printStackTrace();
}
imagePane.widthProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
imageWidth.setValue(newValue);
}
});
imagePane.heightProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
imageHeiht.setValue(newValue);
}
});
registeredPane.visibleProperty().bind(
Bindings.when(angleProperty.lessThan(0)).then(true).otherwise(false));
loginPane.visibleProperty().bind(registeredPane.visibleProperty().not());
initAnimation();
loadingImage();
initAction();
}
private void initAnimation() {
FadeTransition fadeTransition = new FadeTransition(Duration.millis(500), centerPane);
fadeTransition.setFromValue(0f);
fadeTransition.setToValue(1f);
TranslateTransition translateTransition = new TranslateTransition(Duration.millis(500), centerPane);
translateTransition.setInterpolator(Interpolator.EASE_BOTH);
translateTransition.setFromY(400);
translateTransition.setToY(centerPane.getLayoutY());
ParallelTransition parallelTransition = new ParallelTransition();
parallelTransition.setDelay(Duration.millis(1500));
parallelTransition.getChildren().addAll(
fadeTransition,
translateTransition
);
parallelTransition.setCycleCount(1);
parallelTransition.play();
KeyFrame frame1 = new KeyFrame(Duration.ZERO, new KeyValue(angleProperty,
Math.PI / 2, Interpolator.LINEAR));
KeyFrame frame2 = new KeyFrame(Duration.seconds(0.5),
new EventHandler() {
@Override
public void handle(Event event) {
loginPane.setEffect(null);
registeredPane.setEffect(null);
}
}, new KeyValue(angleProperty, -Math.PI / 2, Interpolator.LINEAR));
KeyFrame frame3 = new KeyFrame(Duration.seconds(0.5), new EventHandler() {
@Override
public void handle(Event event) {
loginPane.setEffect(null);
registeredPane.setEffect(null);
}
}, new KeyValue(angleProperty,
Math.PI / 2, Interpolator.LINEAR));
KeyFrame frame4 = new KeyFrame(Duration.ZERO, new KeyValue(angleProperty, -Math.PI / 2, Interpolator.LINEAR));
frontTimeLine.getKeyFrames().addAll(frame1, frame2);
backTimeLine.getKeyFrames().addAll(frame4, frame3);
}
private void setPT(PerspectiveTransform pt, double t) {
double width = 650;
double height = 450;
double radius = width / 2;
double back = height / 10;
pt.setUlx(radius - Math.sin(t) * radius);
pt.setUly(0 - Math.cos(t) * back);
pt.setUrx(radius + Math.sin(t) * radius);
pt.setUry(0 + Math.cos(t) * back);
pt.setLrx(radius + Math.sin(t) * radius);
pt.setLry(height - Math.cos(t) * back);
pt.setLlx(radius - Math.sin(t) * radius);
pt.setLly(height + Math.cos(t) * back);
}
private void loadingImage() {
ImageView logBack = new ImageView("/images/loginBack.jpg");
logBack.fitHeightProperty().bind(imageHeiht);
logBack.fitWidthProperty().bind(imageWidth);
imagePane.getChildren().add(new Label("", logBack));
List<File> files = Arrays.asList(new File(this.getClass().getResource("/images/login/").getPath()).listFiles());
sequentialTransition.setAutoReverse(true);
sequentialTransition.setCycleCount(Timeline.INDEFINITE);
ProcessChain.create().addPublishingTask(() -> imagePane.getChildren(), p -> {
for (int i = 0; i < files.size(); i++) {
File file = files.get(i);
if (!file.isDirectory()) {
String url = "/images/login/" + file.getName();
ImageView imageView = new ImageView(url);
imageView.fitHeightProperty().bind(imageHeiht);
imageView.fitWidthProperty().bind(imageWidth);
Label label = new Label("", imageView);
label.setOpacity(0d);
FadeTransition fadeT = new FadeTransition(Duration.millis(500), label);
fadeT.setDelay(Duration.millis(1500));
fadeT.setFromValue(0f);
fadeT.setToValue(1f);
fadeT.setCycleCount(1);
sequentialTransition.getChildren().add(fadeT);
p.publish(label);
}
}
}).withFinal(() -> sequentialTransition.play()).run();
}
private void initAction() {
errorLabel.visibleProperty().bind(errorLabel.textProperty().isNotEmpty());
errorLabel.managedProperty().bind(errorLabel.visibleProperty());
lodingBar.visibleProperty().bind(centerPane.disableProperty());
lodingBar.managedProperty().bind(lodingBar.visibleProperty());
userNameTextField.focusedProperty().addListener((o, oldVal, newVal) -> {
if (!newVal) {
userNameTextField.validate();
}
});
passWordTextField.focusedProperty().addListener((o, oldVal, newVal) -> {
if (!newVal) {
passWordTextField.validate();
}
});
loginBut.disableProperty().bind(Bindings.or(
userNameTextField.textProperty().isEqualTo(""),
passWordTextField.textProperty().isEqualTo("")));
rootPane.setOnKeyPressed(event -> {
if (event.getCode() == KeyCode.ENTER) {
if (loginBut.isDisable() == false) {
login();
}
}
});
angleProperty.addListener((observable, oldValue, newValue) -> {
setPT(frontEffect, angleProperty.get());
setPT(backEffect, angleProperty.get() - Math.PI);
});
registeredLink.setOnAction(event -> {
loginPane.setEffect(frontEffect);
registeredPane.setEffect(backEffect);
frontTimeLine.play();
});
loginLink.setOnAction(event -> {
loginPane.setEffect(frontEffect);
registeredPane.setEffect(backEffect);
backTimeLine.play();
});
}
/**
* @Description:登录
* @param: []
* @return: void
* @auther: liwen
* @date: 2020/11/6 9:56 上午
*/
@ActionMethod("login")
private void login() {
JwtAuthenticationRequest jwtAuthenticationRequest = new JwtAuthenticationRequest();
jwtAuthenticationRequest.setUsername(userNameTextField.getText());
jwtAuthenticationRequest.setPassword(EncryptUtil.getInstance().Base64Encode(passWordTextField.getText()));
ProcessChain.create()
.addRunnableInPlatformThread(() -> {
centerPane.setDisable(true);
loginBut.setText("正在登录...");
})
.addSupplierInExecutor(() -> Request.connector(LoginFeign.class).login(jwtAuthenticationRequest))
.addConsumerInPlatformThread(rel -> {
if (rel.getStatus() == 200) {
errorLabel.setText("");
ApplicatonStore.setToken(rel.getData());
loadApplicatonStore();
} else {
lodingBar.requestFocus();
errorLabel.setText(rel.getMessage());
}
})
.onException(e -> {
e.printStackTrace();
errorLabel.setText("无法连接服务器,请检查服务器是否启动。");
lodingBar.requestFocus();
})
.withFinal(() -> {
centerPane.setDisable(false);
loginBut.setText("登录");
}).run();
}
public void loadApplicatonStore() {
ProcessChain.create()
.addRunnableInPlatformThread(() -> {
try {
actionHandler.navigate(LoadingController.class);
} catch (Exception e) {
throw new RuntimeException(e);
}
ApplicatonStore.setName("");
ApplicatonStore.getAllMenu().clear();
ApplicatonStore.getMenus().clear();
ApplicatonStore.getElements().clear();
ApplicatonStore.getPermissionMenus().clear();
ApplicatonStore.getRoles().clear();
})
.addSupplierInExecutor(() -> Request.connector(MenuFeign.class).getMenuAll())
.addConsumerInPlatformThread(rel -> ApplicatonStore.getAllMenu().addAll(rel))
.addSupplierInExecutor(() ->
Request.connector(LoginFeign.class).getInfo(ApplicatonStore.getToken())
)
.addConsumerInPlatformThread(rel -> {
if (rel.getStatus() == 200) {
FrontUser frontUser = rel.getData();
ApplicatonStore.setName(frontUser.name);
ApplicatonStore.getMenus().addAll(frontUser.getMenus());
ApplicatonStore.getRoles().addAll(frontUser.getRoles());
ApplicatonStore.getElements().addAll(frontUser.getElements());
ApplicatonStore.setIntroduction(frontUser.getDescription());
for (PermissionInfo permissionInfo : frontUser.getElements()) {
ApplicatonStore.getFeatureMap().put(permissionInfo.getCode(), permissionInfo.getName());
}
} else {
AlertUtil.show(rel);
}
})
.addSupplierInExecutor(() ->
Request.connector(LoginFeign.class).getMenus(ApplicatonStore.getToken())
)
.addConsumerInPlatformThread(rel -> {
ApplicatonStore.getPermissionMenus().addAll(rel);
})
.addSupplierInExecutor(() -> {
List<MenuVO> allMenuList = ApplicatonStore.getAllMenu();
Map<Integer, List<MenuVO>> allMap = allMenuList.stream().collect(Collectors.groupingBy(MenuVO::getParentId));
MenuVO rootMenu = allMenuList.stream().min(Comparator.comparing(MenuVO::getParentId)).get();
List<MenuVO> permissionInfoList = ApplicatonStore.getPermissionMenus();
Map<Integer, List<MenuVO>> permissionInfoMap = permissionInfoList.stream().collect(Collectors.groupingBy(MenuVO::getParentId));
Map<String, List<MenuVO>> permissonTitleMap = permissionInfoList.stream().collect(Collectors.groupingBy(MenuVO::getTitle));
for (MenuVO menu : allMap.get(rootMenu.getId())) {
List<MenuVO> childrenMenus = permissionInfoMap.get(menu.getId());
List<MenuVO> partMenus = permissonTitleMap.get(menu.getTitle());
if (childrenMenus == null && partMenus == null) {
continue;
}
MenuVoCell menuVoCell = new MenuVoCell(menu, childrenMenus);
ApplicatonStore.getMenuVoCells().add(menuVoCell);
}
return 0;
})
.addConsumerInPlatformThread(rel -> {
try {
actionHandler.navigate(MainController.class);
} catch (Exception e) {
throw new RuntimeException(e);
}
})
.onException(e -> {
e.printStackTrace();
try {
actionHandler.navigate(LoginController.class);
} catch (VetoException vetoException) {
vetoException.printStackTrace();
} catch (FlowException flowException) {
flowException.printStackTrace();
}
})
.run();
}
@PreDestroy
private void destroy() {
sequentialTransition.stop();
}
}

View File

@@ -38,7 +38,7 @@
.card-pane {
-fx-background-color: -fx-card-base;
-fx-padding: 10;
-fx-background-radius: 14;
-fx-background-radius: 14px;
-fx-border-color: #313D4F;
-fx-border-width: 1px;
-fx-border-radius: 14px;
@@ -50,11 +50,11 @@
* text和label *
* *
*******************************************************************************/
.text, .label {
.label {
-fx-text-fill: -fx-text-color;
-fx-font-family: "Microsoft YaHei";
-fx-font-weight: 100;
-fx-font-size: -fx-font-base14;
-fx-font-size: 14px;
}
/*******************************************************************************
@@ -218,7 +218,7 @@
.lfx-decorator .lfx-decorator-title-container .lfx-decorator-text {
-fx-fill: -fx-text-color;
-fx-font-size: 16;
-fx-font-size: 16px;
}
.lfx-decorator .lfx-decorator-title-container .jfx-svg-glyph {
@@ -574,7 +574,7 @@
-fx-font-family: "Microsoft YaHei";
-fx-font-weight: BOLD;
-fx-text-fill: -fx-text-color;
-fx-font-size: -fx-font-base16;
-fx-font-size: 16px;
}
/**TableView列头展示隐藏列按钮*/
@@ -705,7 +705,7 @@
}
.jfx-text-field > .input-line,
.jfx-password-fieldxt-field > .input-line,
.jfx-password-field > .input-line,
.jfx-text-area > .input-line,
.jfx-combo-box > .input-line {
-fx-background-color: -jfx-unfocus-color;
@@ -714,27 +714,14 @@
}
.jfx-text-field > .input-focused-line,
.jfx-password-fieldxt-field > .input-focused-line,
.jfx-password-field > .input-focused-line,
.jfx-text-area > .input-focused-line,
.jfx-tejfx-combo-box > .input-focused-line {
.jfx-combo-box > .input-focused-line {
-fx-background-color: -jfx-focus-color;
-fx-pref-height: 1px;
}
.login-text {
-fx-background-color: transparent;
-fx-font-family: "Microsoft YaHei";
-fx-font-weight: 100;
-fx-text-fill: -fx-light-text-color;
-fx-prompt-text-fill: #70665e;
-fx-alignment: top-left;
-jfx-focus-color: #70665e;
-jfx-unfocus-color: -fx-light-text-color;
}
#login-glyph-icon {
-fx-fill: #70665e;
}
/*******************************************************************************

View File

@@ -0,0 +1,57 @@
/*******************************************************************************
* *
* login *
* *
******************************************************************************/
#login-title {
-fx-font-family: "Microsoft YaHei";
-fx-text-fill: #3e3e3e;
-fx-font-size: 30px;
}
#login-error-label {
-fx-font-family: "Microsoft YaHei";
-fx-text-fill: #f56363;
-fx-font-size: 14px;
}
#login-welcome-title {
-fx-font-family: "Microsoft YaHei";
-fx-font-weight: 100;
-fx-text-fill: #ffffff;
-fx-font-size: 45px;
}
#login-prompt {
-fx-font-family: "Microsoft YaHei";
-fx-font-weight: 100;
-fx-text-fill: #7a7a7a;
-fx-font-size: 12px;
}
#login-welcome-text {
-fx-font-family: "Microsoft YaHei";
-fx-font-weight: 100;
-fx-text-fill: #ffffff;
-fx-font-size: 20px;
}
#login-text-field {
-fx-background-color: transparent;
-fx-font-family: "Microsoft YaHei";
-fx-font-weight: 100;
-fx-font-size: 18px;
-fx-text-fill: -fx-light-text-color;
-fx-prompt-text-fill: #70665e;
-fx-alignment: top-left;
-jfx-focus-color: #0355a7;
-jfx-unfocus-color: -fx-light-text-color;
}
#login-svg-glyph{
-jfx-size: 20px;
-fx-background-color: #70665e;
}

View File

@@ -20,6 +20,15 @@ Created by iconfont
/>
<missing-glyph />
<glyph glyph-name="user-name" unicode="&#58882;" d="M652.3 333.29999999999995C741.6 382.70000000000005 802 477.8 802 587c0 160.2-129.8 290-290 290-160.2 0-290-129.8-290-290 0-109.2 60.4-204.3 149.7-253.7C184 273.79999999999995 48 98.29999999999995 48-109l58 0c0 224.2 181.8 406 406 406 224.2 0 406-181.8 406-406l58 0C976 98.29999999999995 840 273.79999999999995 652.3 333.29999999999995zM280 587c0 128.1 103.9 232 232 232 128.1 0 232-103.9 232-232 0-128.1-103.9-232-232-232C383.9 355 280 458.9 280 587z" horiz-adv-x="1024" />
<glyph glyph-name="querenmima" unicode="&#58890;" d="M236.002113 497.084103c0 51.11072-4.088858 102.22144 0 151.287731C248.268686 795.570707 370.934413 901.881004 520.177715 895.747717 661.243302 889.614431 775.731314 771.037561 777.775743 625.883117v-130.843443c10.222144 0 20.444288-2.044429 28.622003-2.044428 83.82158-2.044429 149.243302-69.510579 149.243302-153.33216v-306.664319c0-87.910438-67.46615-157.421017-157.421017-159.465445-190.131878-2.044429-380.263755-2.044429-572.440062 0-89.954867 0-157.421017 71.555008-157.421017 161.509874 0 91.999296 4.088858 183.998591-2.044429 273.953458-4.088858 96.088153 49.066291 179.909734 169.68759 188.087449zM512-56.956099h257.598028c75.643865 0 118.57687 42.933005 118.57687 118.576869V304.907797c0 79.732723-40.888576 120.621299-120.621299 122.665727h-511.107198c-77.688294 0-118.57687-42.933005-120.621299-118.57687v-247.375884c0-71.555008 44.977433-114.488012 116.532441-114.488012 87.910438-4.088858 173.776447-4.088858 259.642457-4.088857z m-212.620594 551.995773h412.974616v126.754585c0 104.265868-77.688294 190.131878-179.909734 202.398451-104.265868 12.266573-204.442879-55.199577-222.842738-157.421017-12.266573-55.199577-8.177715-112.443584-10.222144-171.732019z m0 0M352.534554 229.263931c14.311002 14.311002 36.799718 14.311002 51.11072 0l96.088153-96.088153c14.311002-14.311002 14.311002-36.799718 0-51.11072s-36.799718-14.311002-51.11072 0l-96.088153 96.088154c-14.311002 14.311002-14.311002 36.799718 0 51.110719z m0 0M671.465446 304.907797c14.311002-14.311002 14.311002-36.799718 0-51.11072l-171.732019-171.732019c-14.311002-14.311002-36.799718-14.311002-51.11072 0s-14.311002 36.799718 0 51.11072l171.732019 171.732019c14.311002 12.266573 36.799718 12.266573 51.11072 0z m0 0" horiz-adv-x="1024" />
<glyph glyph-name="password" unicode="&#58883;" d="M780.8 458.479c41.13 0 74.479-33.348 74.479-74.479v-347.546a74.479 74.479 0 0 0-74.479-74.479H234.667a74.479 74.479 0 0 0-74.48 74.48V384c0 41.13 33.349 74.479 74.48 74.479H780.8m0 74.479H234.667A148.958 148.958 0 0 1 85.709 384v-347.546a148.958 148.958 0 0 1 148.958-148.923H780.8a148.958 148.958 0 0 1 148.958 148.923V384A148.958 148.958 0 0 1 780.8 532.9580000000001zM507.733 806.025a173.739 173.739 0 0 0 173.739-173.773v-99.328H334.029v99.328A173.739 173.739 0 0 0 507.767 805.99m0 74.48a248.252 248.252 0 0 1-248.251-248.218v-173.773h496.503V632.2180000000001A248.252 248.252 0 0 1 507.733 880.503z m0-781.961a37.205 37.205 0 0 0-37.205 37.24V284.70500000000004a37.205 37.205 0 0 0 74.41 0v-148.958a37.205 37.205 0 0 0-37.205-37.205z" horiz-adv-x="1024" />
<glyph glyph-name="skin" unicode="&#59039;" d="M694 743.2a59.72 59.72 0 0 0 45.37-20.87L900.7 534 841 414.63l-38.62 38.62a29.87 29.87 0 0 1-51-21.12v-375.94a29.87 29.87 0 0 0-29.87-29.87H333.17a29.87 29.87 0 0 0-29.87 29.87V432.13a29.86 29.86 0 0 1-51 21.12l-38.63-38.62-89.59 119.48 161.33 188.23a59.71 59.71 0 0 0 45.36 20.86h6.08a89.58 89.58 0 0 0 46.79-13.2q76-46.55 128.74-46.55T641.13 730a89.59 89.59 0 0 0 46.8 13.19H694m0 59.74h-6.07a149.24 149.24 0 0 1-78-22c-50.95-31.2-81.16-37.75-97.54-37.75s-46.59 6.58-97.55 37.82a149.25 149.25 0 0 1-78 22h-6.08a119.31 119.31 0 0 1-90.72-41.73L78.72 573a59.75 59.75 0 0 1-2.43-74.72L165.9 378.8a59.74 59.74 0 0 1 77.66-15.89v-306.7a89.71 89.71 0 0 1 89.61-89.61h388.3a89.71 89.71 0 0 1 89.61 89.61V362.9a59.74 59.74 0 0 1 83.3 25l59.74 119.35a59.74 59.74 0 0 1-8.06 65.6L784.73 761.19A119.31 119.31 0 0 1 694 802.94z m0 0" horiz-adv-x="1024" />

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXPasswordField?>
<?import com.jfoenix.controls.JFXProgressBar?>
<?import com.jfoenix.controls.JFXTextField?>
<?import com.jfoenix.controls.JFXToggleButton?>
<?import javafx.scene.control.Hyperlink?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.effect.DropShadow?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<StackPane fx:id="rootPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="970.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Pane fx:id="imagePane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" style="-fx-background-color: #3F007F;" />
<StackPane fx:id="centerPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="450.0" prefWidth="650.0" style="-fx-background-radius: 14;">
<children>
<HBox fx:id="loginPane">
<children>
<AnchorPane maxHeight="1.7976931348623157E308" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="450.0" prefWidth="251.0" style="-fx-background-radius: 14 0 0 14; -fx-background-color: linear-gradient(#e66465, #9198e5);">
<children>
<Label id="login-welcome-title" layoutX="70.0" layoutY="134.0" text="欢迎" textFill="WHITE">
<font>
<Font size="48.0" />
</font>
</Label>
<Label id="login-welcome-text" layoutX="38.0" layoutY="213.0" text="登录访问您的帐户" textFill="WHITE">
<font>
<Font size="20.0" />
</font>
</Label>
<Label layoutX="79.0" layoutY="419.0" text="©中国xxx∙xxx" textFill="#ffffffad" />
</children>
<effect>
<DropShadow color="#0000009e" height="0.0" radius="19.17" width="78.68" />
</effect>
</AnchorPane>
<AnchorPane prefHeight="450.0" prefWidth="352.0" style="-fx-background-color: #ffffff; -fx-background-radius: 0 14 14 0;" HBox.hgrow="ALWAYS">
<children>
<Label id="login-title" layoutX="168.0" layoutY="45.0" text="登录">
<font>
<Font name="System Bold" size="33.0" />
</font>
</Label>
<JFXProgressBar fx:id="lodingBar" layoutX="66.0" layoutY="83.0" visible="false" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" />
<JFXTextField id="login-text-field" fx:id="userNameTextField" labelFloat="true" layoutX="71.0" layoutY="126.0" prefHeight="45.0" prefWidth="260.0" promptText="用户名">
<font>
<Font size="18.0" />
</font>
</JFXTextField>
<JFXPasswordField id="login-text-field" fx:id="passWordTextField" labelFloat="true" layoutX="71.0" layoutY="210.0" prefHeight="45.0" prefWidth="260.0" promptText="密码">
<font>
<Font size="18.0" />
</font>
</JFXPasswordField>
<JFXToggleButton alignment="CENTER_LEFT" layoutX="66.0" layoutY="265.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="45.0" prefWidth="260.0" text="记住密码" />
<JFXButton fx:id="loginBut" layoutX="71.0" layoutY="326.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="260.0" style="-fx-background-color: linear-gradient(#e66465, #9198e5); -fx-background-radius: 25;" text="登录" textFill="#fffefe">
<font>
<Font size="18.0" />
</font>
</JFXButton>
<Hyperlink fx:id="registeredLink" layoutX="226.0" layoutY="404.0" text="注册" />
<Label id="login-prompt" layoutX="141.0" layoutY="408.0" text="还没有帐号?去" />
<VBox alignment="CENTER" layoutY="302.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0">
<children>
<Label id="login-error-label" fx:id="errorLabel" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" VBox.vgrow="ALWAYS" />
</children>
</VBox>
<Label id="icon-label" fx:id="userIcon" alignment="CENTER" contentDisplay="CENTER" layoutX="296.0" layoutY="131.0" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="35.0" prefWidth="35.0" />
<Label id="icon-label" fx:id="pwdIcon" alignment="CENTER" contentDisplay="CENTER" layoutX="296.0" layoutY="215.0" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="35.0" prefWidth="35.0" />
</children>
</AnchorPane>
</children>
</HBox>
<HBox fx:id="registeredPane" visible="false">
<children>
<AnchorPane maxHeight="1.7976931348623157E308" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="450.0" prefWidth="251.0" style="-fx-background-radius: 14 0 0 14; -fx-background-color: linear-gradient(#3F007F, #7226A5);">
<children>
<Label id="login-welcome-title" layoutX="70.0" layoutY="134.0" text="欢迎" textFill="WHITE">
<font>
<Font size="48.0" />
</font>
</Label>
<Label id="login-welcome-text" layoutX="38.0" layoutY="213.0" text="注册访问您的帐户" textFill="WHITE">
<font>
<Font size="20.0" />
</font>
</Label>
<Label layoutX="79.0" layoutY="419.0" text="©中国xxx∙xxx" textFill="#ffffffad" />
</children>
<effect>
<DropShadow color="#0000009e" height="0.0" radius="19.17" width="78.68" />
</effect>
</AnchorPane>
<AnchorPane prefHeight="450.0" prefWidth="352.0" style="-fx-background-color: #ffffff; -fx-background-radius: 0 14 14 0;" HBox.hgrow="ALWAYS">
<children>
<Label id="login-title" layoutX="166.0" layoutY="45.0" text="注册">
<font>
<Font name="System Bold" size="33.0" />
</font>
</Label>
<JFXProgressBar layoutX="66.0" layoutY="83.0" visible="false" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" />
<JFXTextField id="login-text-field" labelFloat="true" layoutX="71.0" layoutY="122.0" prefHeight="45.0" prefWidth="260.0" promptText="用户名" AnchorPane.topAnchor="122.0">
<font>
<Font size="18.0" />
</font>
</JFXTextField>
<JFXPasswordField id="login-text-field" labelFloat="true" layoutX="69.0" layoutY="197.0" prefHeight="45.0" prefWidth="260.0" promptText="密码" AnchorPane.topAnchor="197.0">
<font>
<Font size="18.0" />
</font>
</JFXPasswordField>
<JFXButton layoutX="71.0" layoutY="340.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="260.0" style="-fx-background-color: linear-gradient(#3F007F, #7226A5); -fx-background-radius: 25;" text="注册" textFill="#fffefe">
<font>
<Font size="18.0" />
</font>
</JFXButton>
<Hyperlink fx:id="loginLink" layoutX="212.0" layoutY="402.0" text="登录" />
<Label id="login-prompt" layoutX="147.0" layoutY="406.0" text="已有帐号去" />
<JFXPasswordField id="login-text-field" labelFloat="true" layoutX="67.0" layoutY="270.0" prefHeight="45.0" prefWidth="260.0" promptText="确认密码" AnchorPane.topAnchor="270.0">
<font>
<Font size="18.0" />
</font>
</JFXPasswordField>
<Label id="icon-label" fx:id="reuserIcon" alignment="CENTER" contentDisplay="CENTER" layoutX="292.0" layoutY="127.0" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="35.0" prefWidth="35.0" />
<Label id="icon-label" fx:id="repwdIcon" alignment="CENTER" contentDisplay="CENTER" layoutX="292.0" layoutY="202.0" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="35.0" prefWidth="35.0" />
<Label id="icon-label" fx:id="repwd2Icon" alignment="CENTER" contentDisplay="CENTER" layoutX="292.0" layoutY="275.0" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="35.0" prefWidth="35.0" />
</children>
</AnchorPane>
</children>
</HBox>
</children>
<effect>
<DropShadow color="#0000009e" height="0.0" offsetY="10.0" radius="44.9725" width="181.89" />
</effect>
</StackPane>
</children>
</StackPane>

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 MiB

View File

@@ -5,74 +5,139 @@
* @date: 2020/9/11 10:53
*/
import com.epri.fx.client.AppStartup;
import com.epri.fx.client.store.ApplicatonStore;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.svg.SVGGlyph;
import com.jfoenix.svg.SVGGlyphLoader;
import javafx.animation.Interpolator;
import javafx.animation.RotateTransition;
import javafx.animation.SequentialTransition;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.geometry.Point3D;
import javafx.scene.DepthTest;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.PerspectiveTransform;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.io.IOException;
public class TestFx extends Application {
//正面视图
public StackPane frontNode;
//反面视图
public StackPane backNode;
//是否翻转
boolean flipped = false;
//翻转角度
DoubleProperty time = new SimpleDoubleProperty(Math.PI / 2);
//正面翻转特效
PerspectiveTransform frontEffect = new PerspectiveTransform();
//反面翻转特效
PerspectiveTransform backEffect = new PerspectiveTransform();
Timeline anim = new Timeline();
Timeline anim1 = new Timeline();
@Override
public void start(Stage primaryStage) throws Exception {
new Thread(() -> {
try {
SVGGlyphLoader.loadGlyphsFont(AppStartup.class.getResourceAsStream("/fonts/icon_font/iconfont.svg"),
ApplicatonStore.ICON_FONT_KEY);
// SVGGlyphLoader.loadGlyphsFont(AppStartup.class.getResourceAsStream("/fonts/icon_font/icon-font-solid.svg"),
// "IconFontSolid.svg");
} catch (IOException ioExc) {
ioExc.printStackTrace();
}
}).start();
JFXButton button = new JFXButton("");
button.setPrefHeight(100);
button.setPrefWidth(200);
button.setRipplerFill(Color.RED);
SVGGlyph materialIconView = SVGGlyphLoader.getIcoMoonGlyph(ApplicatonStore.ICON_FONT_KEY + ".home-outline");
// materialIconView.setDepthTest(DepthTest.DISABLE);
materialIconView.setRotationAxis(new Point3D(0, 1, 0));
materialIconView.setSize(80);
button.setGraphic(materialIconView);
StackPane stackPane = new StackPane();
stackPane.getChildren().add(button);
StackPane rootPane = new StackPane();
RotateTransition transition1 = new RotateTransition(Duration.millis(500), materialIconView);
transition1.setByAngle(180);
transition1.setInterpolator(Interpolator.EASE_BOTH);
transition1.setOnFinished(event -> {
});
button.setOnMouseEntered(event -> {
transition1.play();
});
button.setOnMouseExited(event -> {
transition1.play();
});
Scene scene = new Scene(stackPane, 1000, 700);
rootPane.getChildren().addAll(create());
Scene scene = new Scene(rootPane, 1000, 700);
primaryStage.setScene(scene);
primaryStage.setTitle("JavaFX Welcome");
primaryStage.show();
}
private StackPane create() {
Button a= new Button("正面视图");
Button b= new Button("反面视图");
a.setOnAction(event -> {
frontNode.setEffect(frontEffect);
backNode.setEffect(backEffect);
anim.play();
});
b.setOnAction(event -> {
frontNode.setEffect(frontEffect);
backNode.setEffect(backEffect);
anim1.play();
});
frontNode = new StackPane();
frontNode.getChildren().add(a);
frontNode.setStyle("-fx-background-color: #11aa55");
backNode = new StackPane();
backNode.getChildren().add(b);
backNode.setStyle("-fx-background-color: #88bb55");
KeyFrame frame1 = new KeyFrame(Duration.ZERO, new KeyValue(time,
Math.PI / 2, Interpolator.LINEAR));
KeyFrame frame2 = new KeyFrame(Duration.seconds(1),
new EventHandler() {
@Override
public void handle(Event event) {
frontNode.setEffect(null);
backNode.setEffect(null);
}
}, new KeyValue(time, -Math.PI / 2, Interpolator.LINEAR));
KeyFrame frame3 = new KeyFrame(Duration.seconds(1), new EventHandler() {
@Override
public void handle(Event event) {
frontNode.setEffect(null);
backNode.setEffect(null);
}
}, new KeyValue(time,
Math.PI / 2, Interpolator.LINEAR));
KeyFrame frame4 = new KeyFrame(Duration.ZERO, new KeyValue(time, -Math.PI / 2, Interpolator.LINEAR));
time.addListener((observable, oldValue, newValue) -> {
setPT(frontEffect, time.get());
setPT(backEffect, time.get() - Math.PI);
});
anim.getKeyFrames().addAll(frame1, frame2);
anim1.getKeyFrames().addAll(frame4, frame3);
backNode.visibleProperty().bind(
Bindings.when(time.lessThan(0)).then(true).otherwise(false));
frontNode.visibleProperty().bind(backNode.visibleProperty().not());
StackPane stackPane = new StackPane();
stackPane.setPrefSize(460, 450);
stackPane.setMaxSize(460, 450);
stackPane.getChildren().addAll(backNode, frontNode);
return stackPane;
}
private void setPT(PerspectiveTransform pt, double t) {
double width = 450;
double height = 450;
double radius = width / 2;
double back = height / 10;
pt.setUlx(radius - Math.sin(t) * radius);
pt.setUly(0 - Math.cos(t) * back);
pt.setUrx(radius + Math.sin(t) * radius);
pt.setUry(0 + Math.cos(t) * back);
pt.setLrx(radius + Math.sin(t) * radius);
pt.setLry(height - Math.cos(t) * back);
pt.setLlx(radius - Math.sin(t) * radius);
pt.setLly(height + Math.cos(t) * back);
}
public static void main(String[] args) {
launch(args);
}

View File

@@ -0,0 +1,94 @@
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.animation.AnimationTimer;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.effect.Lighting;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.text.Text;
import javafx.util.Duration;
public class TimelineEvents extends Application {
//主时间轴
private Timeline timeline;
private AnimationTimer timer;
//用于指定实际帧的变量
private Integer i=0;
@Override public void start(Stage stage) {
Group p = new Group();
Scene scene = new Scene(p);
stage.setScene(scene);
stage.setWidth(500);
stage.setHeight(500);
p.setTranslateX(80);
p.setTranslateY(80);
//创建一个带有特效的圆
final Circle circle = new Circle(20, Color.rgb(156,216,255));
circle.setEffect(new Lighting());
//在圆内部创建一个文本
final Text text = new Text (i.toString());
text.setStroke(Color.BLACK);
//为带有文本的圆创建一个布局
final StackPane stack = new StackPane();
stack.getChildren().addAll(circle, text);
stack.setLayoutX(30);
stack.setLayoutY(30);
p.getChildren().add(stack);
stage.show();
//为了移动圆创建一个时间轴
timeline = new Timeline();
timeline.setCycleCount(1);
timeline.setAutoReverse(true);
//在每个帧开始时你可以添加一个特定的动作
timer = new AnimationTimer() {
@Override
public void handle(long l) {
text.setText(i.toString());
i++;
}
};
//创建一个带有缩放因子的keyValue:将圆缩放2倍
KeyValue keyValueX = new KeyValue(stack.scaleXProperty(), 2);
KeyValue keyValueY = new KeyValue(stack.scaleYProperty(), 2);
//创建一个KeyFrame, keyValue会在2秒钟时抵达
Duration duration = Duration.millis(2000);
//当抵达关键帧时可以指定一个特定的动作
EventHandler onFinished = new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
stack.setTranslateX(java.lang.Math.random()*200-100);
//复位计数器 
i = 0;
}
};
KeyFrame keyFrame = new KeyFrame(duration, onFinished , keyValueX, keyValueY);
//将关键帧添加到时间轴中
timeline.getKeyFrames().add(keyFrame);
timeline.play();
timer.start();
}
public static void main(String[] args) {
Application.launch(args);
}
}