# 浅析 Java 开发案例——iGoBang
![1.png](./figure/1.png)
# 界面元素
在看到这个开发案例的界面时时,一定会有很多人想问这个问题:按照教科书上的JavaFX代码来编写程序,其界面都是千篇一律的白色风格,如何像这个案例一样设计出种类多样、色彩丰富的界面元素呢?
通过了解以下拓展知识,你也可以设计一套属于自己风格的界面
## JavaFX CSS
JavaFX为开发者提供了一套层叠样式表语言(JavaFX CSS,以下简称FXSS),即通过将不同样式属性(背景图片、文字颜色等)的属性值写到一个文件中,再由JavaFX载入生效从而改变默认的界面样式。其语法与Web开发中的的CSS类似,想要了解CSS语言的同学,可以参考这个链接:
[CSS入门教程(W3School)](http://www.w3school.com.cn/css/css_reference.asp)
建议之前没有了解过CSS的同学**粗略过一遍**上面的教程。
与CSS不同的是,FXSS的语法略显不同,这种差异性主要体现在样式属性名上:FXSS的属性名全部带有```-fx-```前缀以和CSS区分。理论总是枯燥的,下面以几个界面元素为例,简述如何对界面上的按钮应用不同的风格:
![2.png](./figure/2.png)
# 样例:红色按钮(通过内嵌FXSS样式到Java代码中)
(对于下列代码中用到的FXSS属性,同学们只需了解即可,稍后会贴上完整的FXSS属性参考文档)
## 创建红色按钮类并继承JavaFX默认的按钮
```Java
import javafx.scene.control.Button;
/**
* 红色的按钮
*/
public class RedButton extends Button {
public RedButton(String title) {
super(title);
this.setStyle(this.getStyle() + "-fx-base:#b71a1a;");
/* -fx-base 代表背景颜色,#b71a1a是一种红色的颜色码
* 可以利用这个工具创建自己的颜色码:http://atool.org/colorpicker.php */
this.setStyle(this.getStyle() + "-fx-text-fill:#ffdfdf;");
// -fx-text-fill 代表文本颜色,#b71a1a是一种白灰色的颜色码
this.setStyle(this.getStyle() + "-fx-font-size:12;");
// -fx-text-fill 代表文本字号
this.setStyle(this.getStyle() + "-fx-pref-width:200;");
// -fx-text-fill 代表按钮偏好大小,相当于JavaFX中的setPrefSize()方法
this.setStyle(this.getStyle() + "-fx-background-radius:2em;");
// -fx-background-radius 代表圆角半径,使按钮边角变得更加圆润,em是相对大小单位
this.setStyle(this.getStyle() + "-fx-padding: 10px;");
// -fx-padding 代表四周留白空间,px是尺寸单位(像素)
}
}
```
## 创建一个简单的程序来使用这个按钮
```Java
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Pane pane = new Pane();
RedButton redButton = new RedButton("Hello");
// 创建并使用红色按钮对象
pane.getChildren().addAll(redButton);
Scene scene = new Scene(pane);
primaryStage.setScene(scene);
primaryStage.show();
}
}
```
效果如图所示:
![3.png](./figure/3.png)
# 将FXSS代码写入到文件中
之前的样例中虽然通过在Java代码中写入样式来实现红色按钮的效果,但是这样的代码并不优雅,因为在实际的开发中往往需要嵌入大量的样式属性而不是像本文中的例子一样仅仅是几行代码就能解决
因此,将样式写入到一个文件中,打开程序时动态加载是一个更好的选择。下面我们就来动手创建一个这样的工程
## 建立样式文件
在工程目录新建资源目录,并命名为res
![4.png](./figure/4.png)
在```File——Project Structure```中将res目录设置为资源路径
![5.png](./figure/5.png)
这样一来,在res目录中建立的样式文件都可以被Java加载,现在在res文件中创建新的样式文件
![6.png](./figure/6.png)
在里面写上如下代码:
```CSS
.red-button{
/* 此处的red-button代表一个类名,在Java代码中为界面元素加入这个类名即可应用此处的所有样式 */
-fx-font-size:12;
-fx-pref-width:200;
-fx-background-radius: 2em;
-fx-base:#b71a1a;
-fx-text-fill:#ffdfdf;
-fx-padding: 10px;
}
```
这样以来,RedButton类就可以改成下面这种形式:
```Java
import javafx.scene.control.Button;
/**
* 红色的按钮
*/
public class RedButton extends Button {
public RedButton(String title) {
super(title);
this.getStyleClass().add("red-button");
// 将按钮与CSS文件中的red-button类名绑定
}
}
```
同时,在程序运行时载入写好的CSS资源文件:
```Java
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Pane pane = new Pane();
Scene scene = new Scene(pane);
scene.getStylesheets().add(Main.class.getResource("red-button.css").toString());
// 载入资源文件的固定格式
RedButton redButton = new RedButton("Hello");
pane.getChildren().addAll(redButton);
primaryStage.setScene(scene);
primaryStage.show();
}
}
```
这样一来,Java代码的简洁性就提高了很多,这么做的好处是显而易见的:
+ 可以将不同界面元素与同一个CSS文件中的不同类名绑定,实现样式的统一管理
+ 修改样式无需在大量的Java样式中翻找,修改css文件即可
+ 可以通过加载不同的css文件实现整体样式变换
对FXSS有更深一步了解需求的同学,可以参考下面的教程:
+ [JavaFX CSS简单使用教程1](https://www.yiibai.com/javafx/css-style.html)
+ [JavaFX CSS简单使用教程2](https://blog.csdn.net/zavens/article/details/43560797)
+ [JavaFX CSS官方参考代码(包含所有的样式属性)](https://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html)
+ 本案例中的的res/stylesheet
# 动画
相信很多人都会觉得,动画是这个案例中最引人注目的一点。这些动画看起来复杂,实际上只要理解这些动画的本质,实现起来非常简单
就像~~人类的本质是复读机~~一样,**动画**的本质就是属性随着时间变动。比如透明度随时间降低,就是渐隐动画;尺寸随动画变大,就是缩放动画。倘若属性随时间变化越来越慢(如尺寸的变大逐渐减慢)则就是案例中的缓动动画。下面就按照这个原理解释动画的实现
**注意:要理解下列实现过程,请先保证自学完教科书第15章的Timeline部分**
## 属性
JavaFX将很多属性都包装成了对象,比如:
```Java
button.prefWidthProperty();
// 按钮的宽度属性
button.opacityProperty();
// 按钮的透明度属性
```
这些属性对象(必须是非只读)可以被重新赋值,从而在界面上体现出来。那么如果能实现随着时间的推移连续地对这些属性赋值,就可以构成动画。这就需要用到JavaFX中的```Timeline```类
## 对 Timeline 的包装
下列代码编写一个缓动动画类(EasingProperty),它接受一个属性对象,并支持以动画的方式改变该属性的值。**无需担心代码过长难以理解,代码中的注释已经提供了充分的解释**,同学们只需先按步骤试着将代码拷贝到一个测试工程中,逐步理解每一行代码代表的操作,就可以用该动画类实现很多操作了
```Java
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.beans.pr
没有合适的资源?快使用搜索试试~ 我知道了~
JavaFX 开发的五子棋iGoBang.zip
共114个文件
java:50个
png:23个
mp3:9个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
1 下载量 166 浏览量
2024-05-12
17:14:59
上传
评论
收藏 103.13MB ZIP 举报
温馨提示
五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
资源推荐
资源详情
资源评论
收起资源包目录
JavaFX 开发的五子棋iGoBang.zip (114个子文件)
configure.conf 8B
root.css 2KB
steplist.css 697B
savelist.css 663B
selectorlist.css 597B
startupdisplay.css 52B
startup.flv 2.27MB
测试存档2.game 2KB
.gitignore 19B
.gitignore 15B
.gitignore 13B
iGoBang.iml 497B
UILinker.java 14KB
ContentPane.java 8KB
PieceSequence.java 8KB
AI.java 8KB
Piece.java 5KB
GameDisplay.java 5KB
EasingProperty.java 5KB
OperationBar.java 4KB
SaveDialog.java 3KB
BackgroundView.java 3KB
TipDisplay.java 3KB
GameCheckBox.java 3KB
NameInputDialog.java 2KB
MusicSelector.java 2KB
LogoView.java 2KB
Configure.java 2KB
SlowRolling.java 2KB
Launcher.java 2KB
SkinSelector.java 2KB
DataCenter.java 2KB
TimeDisplay.java 2KB
ButtonBar.java 1KB
BackgroundChannel.java 1KB
RenameDialog.java 1KB
StartupDisplay.java 1KB
MessageBox.java 1KB
MusicPlayer.java 1KB
SaveListView.java 1KB
DialogBase.java 1KB
MenuButton.java 947B
MenuBar.java 908B
FadingCircle.java 782B
Step.java 653B
PopupBase.java 646B
IconButton.java 645B
InputDialog.java 619B
Orientation.java 510B
ChessBoard.java 458B
GameButton.java 377B
TitleLabel.java 355B
GreenButton.java 351B
SelectorListView.java 350B
RedButton.java 341B
BlueButton.java 336B
StepListView.java 303B
Direction.java 269B
AlertLabel.java 238B
ContextLabel.java 238B
GameTextField.java 233B
PieceType.java 187B
二次元星空.jpg 1.32MB
浪潮.jpg 1.1MB
优美圣地.jpg 1.04MB
幻境.jpg 1.03MB
极地雪峰.jpg 846KB
宇宙奇幻.jpg 815KB
你的名字.jpg 687KB
黑色炫酷.jpg 664KB
田园风光.jpg 518KB
README.md 16KB
MANIFEST.MF 51B
Let's Cross The Rainbow.mp3 18.39MB
天空を駆ける風の都.mp3 11.25MB
Utakata.mp3 10.14MB
Autumn Leaf.mp3 9.26MB
Yet So Close.mp3 9.17MB
Letter.mp3 9.17MB
Winter.mp3 8.67MB
雨道.mp3 8.46MB
Masked Heroes.mp3 8.07MB
1.png 377KB
icon.png 369KB
10.png 127KB
chessboard.png 86KB
logo.png 56KB
5.png 51KB
8.png 38KB
9.png 24KB
piece_white.png 23KB
6.png 22KB
piece_black.png 22KB
highlight_white.png 22KB
highlight_black.png 21KB
save.png 20KB
blank.png 19KB
item.png 19KB
msg.png 19KB
skin.png 15KB
共 114 条
- 1
- 2
资源评论
枫蜜柚子茶
- 粉丝: 6697
- 资源: 4871
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功