简介:JavaFX是继awt和swing之后新出来的图形界面设计,全方面胜过它们。
一、步骤
1.开发环境,JDK(1.8以上)
2.数据库随便来一个就行(写系统需要,如果只是单纯的玩布局就不需要),建议mysql、sqlserver、oracle等,但是一定要记得导驱动jar包,会maven的朋友也可以使用maven
3.dao分层(一般有四个包)
3.1.application(启动包)
3.2.entity(实体包)
3.3.dao(dao包)
3.4.utils(jdbc帮助类以及一些公共用到的方法的类等等存放的帮助包)
4.先继承我们的Application(javafx的启动类,切记不要导错包)
5.然后重写我们的Application的唯一一个抽象方法public void start(Stage primaryStage);
6.写出main方法程序入口,在方法体中写入Application.launch(args);
注意:args可以不写进去,也可以直接launch();当然继承了也可以用我们自己的类名.launch();这些都是可以的
7.然后在start方法中写出primaryStage.show();如果没写这一步,就不会有任何的反应,很多人都会觉得自己代码写错了,其实是这步没写。这是最重要的!
8.首先是Stage(舞台)里面一定要放入Scene(场景),Scene(场景)里面一定要放入Pane(布局),Pane里不一定要放入Node(节点或控件),只要完成Stage<--Scene<--Pane,
代码:
Pane pane=new Pane();-----绝对布局
Scene scene=new Scene(pane,900,900);---new一个场景对象
primaryStage.setScene(scene);---设置场景
恭喜你,这三步完成那你就完成了一个窗口了!
二、布局(Pane)
通用常见的方法:
2.1流式布局(FlowPane)
Button login=new Button("登录");
Button exit=new Button("退出");
FlowPane fp=new FlowPane();
//fp.getChildren().add(login);
//fp.getChildren().addAll(login,exit);
这就是流式布局的一个基本用法,getChildren()方法是Pane给予子类的一个拿到ObservableList<Node>的一个集合,既然是集合就能add进去。但是流式布局会随着舞台大小的宽度布局,若一行排不下,则会自动换行继续排版,所以这里非常不方便,需要设置合适的舞台宽度并且不允许用户拖拽舞台的大小,需要这个方法:
primaryStage.setResizble(false);
流式布局的排版默认居左上角,顺序与add时的顺序有关
2.2边框布局(BorderPane)
该布局非常特殊,只有上(Top)、下(Bottom)、左(Left)、右(Right)、中(Center)个区域,并且每个区域只能放一个东西,这里我们想利用边框布局完成高难度的窗口就需要用到布局的嵌套了:
BorderPane bp=new BorderPane();
//上:下拉框和查询文本框和查询按钮
ComboBox cb=new ComboBox();
TextField selecttf=new TextField();
Button select=new Button("查询");
HBox h=new HBox(20,cb);
h.getChildren().addAll(selecttf,select);
h.setAlignment(Pos.CENTER);
h.setPadding(new Insets(20,0,20,0));
bp.setTop(h);
这里一般都是用这种形式加入到边框布局的上方,其他方位同理
2.3垂直布局(VBox)
VBox v=new VBox();
Button b=new Button("hello world");
Button a=new Button("hi");
v.getChildren().addAll(a,b);
v.setSpacing(20);
垂直布局顾名思义是垂直排列的,所以不管你怎么使用都是竖着的,Spacing就是设置间隙的意思
2.4水平布局(HBox)
HBox h=new HBox();
与垂直布局同理,不管放多少都是水平排列方式横着的,也有Spacing这个方法
2.5网格布局(GridPane)
GridPane gp=new GridPane();
Button b1=new Button("芜湖");
Button b2=new Button("嗨嗨");
gp.addRow(0,b1,b2);//row(第几行),Node...(一行放多个控件,排列顺序与你写的顺序一致)
gp.add(b1,0,0);//Node(控件),column(第几列),row(第几行)
gp.add(b2,1,0);
至于这个网格布局其实就是几列几行来的,addRow是一行一行增加,更加便捷,当然也有不好的地方。比如我们注册的时候,性别:男 女,这里可以看出,有三列,若我们上面都是两列,这里有三列就说不过去了,这时候会出现严重的布局排列很丑的现象,那么我们需要利用布局嵌套,像这样:
GridPane gp=new GridPane();
Label sex=new Label("性别:");
RadioButton man=new RadioButton("男");
RadioButton woman=new RadioButton("女");
ToggleGroup g=new ToggleGroup();
man.setToggleGroup(g);
woman.setToggleGroup(g);
HBox h=new HBox(15,man,woman);
gp.addrow(0,sex,h);
这样就可以解决问题了
2.6表格视图(TableView)
在我看来表格其实是对初学者最好的选择,它既不麻烦而且自身的默认属性对初学者很友好,我对于表格视图非常热衷,所以有了以下几点研究
(1)编辑事件:(Edit)
Tableview.setEidable(true);这样只是给整个表格设置了可编辑,但是并没有编辑时提供的东西,于是表格列中的setCellFactory这个方法就有了作用;
代码视图:
效果图:
正如大家看到的,双击单元格就可以编辑,setOnEditCommit也是对应的一个编辑事件处理,回车就会自动调用编辑事件处理的。这还不是最厉害的,其实表格编辑时不止能放文本框进行编辑,也可以放比如下拉框等,感兴趣的可以去试试,这里我就只演示下拉框
代码:
效果图:
可以看到编辑时,出现了下拉框
那对于要回车才能完成编辑,我还是不满足,于是有了只要失焦就可以完成编辑
代码:(继承TableCell并重写其方法,和给了它一个文本框)
这份代码还不够,还要在对应的列实现下面的代码才具有该功能!
这个Editingcell只是我写的那个类而已
编辑事件就此结束
其实对于setCellValueFactory这个方法,我的看法就是对于实体类的属性,通过new PropertyValueFactory("实体类的成员属性名")的流文件形式读取对应实体类属性的get属性的方法,所以我在其他列中想加什么加什么;
看代码:
我们第一步先在对应泛型的实体类中写出我们需要的控件
再公开setget方法
第二步绑值
来看效果图
所以啊,表格视图真的挺好用,这里要提一点,放进去了,但是如果想要它有效果,需要在实体类的get方法中写点击事件
(3).之前说表格视图默认的非常友好,具体有排序,自带的滑动面板等,但是默认的能拖拽表格的列,还能拖拽宽高也就,
别担心,以下代码可以帮到你
这样你的表格只要设置妥当,那就是完美的啦
2.7锚布局(AnchorPane)
AnchorPane an=new AnchorPane();
Button b1=new Button("按我");
Button b2=new Button("点我");
an.getChildren().addAll(b1,b2);
//这里一定要将第二个参数写成浮点型,否则会报错!
an.setBottomAnchor(b1,20.0);//距离最底下多少像素
an.setLeftAnchor(b2, 30.0);//距离最左边多少像素
an.setTopAnchor(b1, 10.8);//距离最上方多少像素
an.setRightAnchor(b2, 15.5);//距离最右边多少像素
就是很方便,只要坐标和位置设置正确,随便想放哪放哪。写完会报黄色警告,若不想的话,请将an写成AnchorPane,因为这些方法是静态的,我用对象点了。也可以去设置为不警告,还可以抑制这个警告用@SuppressWarnings("static-access")
但是还有更方便的:
b1.setLayoutX(20);
b1.setLayoutY(20);
这个就很简单,设置X和Y轴的坐标位置,非常清晰让人简单理解
三、节点/控件(Node)
3.1文本框(TextField)
TextField tf=new TextField();
tf.setPromptText("提示文本");
这个方法则是这种效果,并不是实打实的文字
这种一点击就会消失,可以提高用户体验感和我们程序员写代码的便捷
3.2密码框(PasswordField)
PasswordField pf=new PasswordField();
TextField pf2=new PasswordField();//里氏替换原则
很好,这里我们可以清晰的看出PasswordField extends TextField对吧
所以文本框有的方法,密码框肯定也有,可能有些被重写了,但是基本都是一样的
注意:写的时候可要分清了,否则写成第二种,它是不会报错的,但是会将文本框变成密码框,就会很难受,这种错误最难找了。希望你不要犯这种错误!
3.3按钮(Button)
Button b=new Button("嗨嗨");
顾名思义就是一个按钮的意思,对应的构造函数和setText(String str)方法都是给按钮设置名称的
那么就有点击事件:
b.setOnAction(e->{//点击事件
System.out.println("你点击了我");
});
这里我们使用的是一种写法,叫lambda写法,若你的写不出来,那就是jdk不支持该写法,要换jdk环境啦朋友。当然也有很多种写法,但我最推荐这种写法。
按钮还有很多样式设置,当然这些和我们的JavaFX-CSS相关。建议看看CSS让你的FX更充实
ImageView imageview=new ImageView(new Image("路径",20,20,true,true));
Button button=new Button("",imageview);
button.setStyle("-fx-cursor:hand;");
以上的代码可以形成图片按钮,下面设置的鼠标样式,进入时变成手形状。
3.4标签(Label)
Label welcome=new Label("欢迎");
这个控件只是用来放置文字的……
3.5文本(Text)
Text t1 = TextBuilder.create().text("欢迎使用学生管理系统").font(Font.font("KaiTi", 55)).build();
t1.setFill(new LinearGradient(0, 0, 1, 2, true, CycleMethod.REPEAT, new Stop(0.5f, Color.RED)));
t1.setStrokeWidth(1);
t1.setStroke(Color.GREY);
这个其实已经被弃用了,但是我觉得蛮好用的就放在这里了,有需要直接copy即可。
下面也就是设置文本的颜色,可以设置渐变色和嵌套色。
3.6下拉框(ComboBox与ChoiceBox)
ComboBox<Object> cb=new ComboBox<>();
ChoiceBox<Object>cb2=new ChoiceBox<>();
cb.getItems().addAll("编号","名称");//给下拉框添加选项
cb.setValue(cb.getItems().get(0));//设置默认值
cb.setPromptText("请选择");//设置提示文本
这两个我觉得最大的区别就是,ComboBox可以设置提示文本,但是效果和默认值好像。想了解更多可以去搜一下。
若你要取到用户选择的哪个选项可以用getValue();来获得
3.7复选框(CheckBox)
CheckBox c1=new CheckBox("打篮球");
CheckBox c2=new CheckBox("睡觉");
复选框就是能选择多个的按钮,可以用boolean f=isselected();来判断该复选框是否被选中。
3.8单选按钮(RadioButton)
RadioButton man=new RadioButton("男");
RadioButton woman=new RadioButton("女");
ToggleGroup g=new ToggleGroup();
//设置为同一组,实现单选功能
man.setToggleGroup(g);
woman.setToggleGroup(g);
单选按钮也是通过Boolean f=man.isselected();来判断哪个按钮被选中,为了防止用户不选出现空值,可以用man.setSelected(true);来设置默认选中男
3.9图片与图片视图(Image与ImageView)
String URL="图片路径";
Image image=new Image(URL,20,20,true,true);
ImageView imageview=new ImageView(image);
图片是用来创建一个图片容器的,而图片视图时用来展示图片的,后面的true是等比例缩放,就不会被你设置的图片宽高影响。