JavaFx苦逼之路

啊啊啊,JavaFX贼难玩,不喜欢

前言

目前我能用javafx做的东西都很少,还跟在大佬屁股后面学习.说不定写着写着就脱坑停更!

绑定tableView

  • 需求是绑定几个测试参数到tableView下如图

1.jpg-11.6kB

  • 结构为:tabPane -> Tab -> tableView -> 若干个TableColumn

第一步先设置fx:id

tableView上肯定需要fx:id,然后在给每一列绑定fx:id,如下图

2.jpg-14kB3.jpg-51.7kB

第二步,编写相关联的实体

由于我的tableview中显示的数据封装在了实体类中,所以这里我们需要先定义实体,实体的定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.StringProperty;

/**
* 限价委托实体类
*/
public class LimitEntrustEntity extends Commission{

private DoubleProperty orderState = new SimpleDoubleProperty(); //已成交数量

private DoubleProperty priceOfOrder = new SimpleDoubleProperty(); //成交均价

private DoubleProperty gvm = new SimpleDoubleProperty(); //成交总额

public LimitEntrustEntity(DoubleProperty orderState, DoubleProperty priceOfOrder, DoubleProperty gvm) {
this.orderState = orderState;
this.priceOfOrder = priceOfOrder;
this.gvm = gvm;
}

public LimitEntrustEntity() {

}

public double getOrderState() {
return orderState.get();
}

public DoubleProperty orderStateProperty() {
return orderState;
}

public void setOrderState(double orderState) {
this.orderState.set(orderState);
}

public double getPriceOfOrder() {
return priceOfOrder.get();
}

public DoubleProperty priceOfOrderProperty() {
return priceOfOrder;
}

public void setPriceOfOrder(double priceOfOrder) {
this.priceOfOrder.set(priceOfOrder);
}

public double getGvm() {
return gvm.get();
}

public DoubleProperty gvmProperty() {
return gvm;
}

public void setGvm(double gvm) {
this.gvm.set(gvm);
}

@Override
public double getCommissionQty() {
return super.getCommissionQty();
}

@Override
public DoubleProperty commissionQtyProperty() {
return super.commissionQtyProperty();
}

@Override
public void setCommissionQty(double commissionQty) {
super.setCommissionQty(commissionQty);
}

@Override
public double getCommissionTime() {
return super.getCommissionTime();
}

@Override
public DoubleProperty commissionTimeProperty() {
return super.commissionTimeProperty();
}

@Override
public void setCommissionTime(double commissionTime) {
super.setCommissionTime(commissionTime);
}

@Override
public double getCommissionPrice() {
return super.getCommissionPrice();
}

@Override
public DoubleProperty commissionPriceProperty() {
return super.commissionPriceProperty();
}

@Override
public void setCommissionPrice(double commissionPrice) {
super.setCommissionPrice(commissionPrice);
}

@Override
public int getState() {
return super.getState();
}

@Override
public IntegerProperty stateProperty() {
return super.stateProperty();
}

@Override
public void setState(int state) {
super.setState(state);
}

@Override
public String getOrderSource() {
return super.getOrderSource();
}

@Override
public StringProperty orderSourceProperty() {
return super.orderSourceProperty();
}

@Override
public void setOrderSource(String orderSource) {
super.setOrderSource(orderSource);
}
}

这里我继承了父类,父类如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package com.yczr.threebody.pc.entity;


import javafx.beans.property.*;

import java.io.Serializable;

public class Commission implements Serializable {
private DoubleProperty commissionQty = new SimpleDoubleProperty(); //委托数量 2
private DoubleProperty commissionTime = new SimpleDoubleProperty(); //委托时间 2
// private DoubleProperty triggerPrice; //触发价格 1
private DoubleProperty commissionPrice = new SimpleDoubleProperty(); //委托价格 2
// private TradeStatus realTriggerPrice; //真实触发价 1
private IntegerProperty state = new SimpleIntegerProperty(); //状态 2
private StringProperty orderSource = new SimpleStringProperty(); //订单来源 2


public double getCommissionQty() {
return commissionQty.get();
}

public DoubleProperty commissionQtyProperty() {
return commissionQty;
}

public void setCommissionQty(double commissionQty) {
this.commissionQty.set(commissionQty);
}

public double getCommissionTime() {
return commissionTime.get();
}

public DoubleProperty commissionTimeProperty() {
return commissionTime;
}

public void setCommissionTime(double commissionTime) {
this.commissionTime.set(commissionTime);
}

// public double getTriggerPrice() {
// return triggerPrice.get();
// }
//
// public DoubleProperty triggerPriceProperty() {
// return triggerPrice;
// }
//
// public void setTriggerPrice(double triggerPrice) {
// this.triggerPrice.set(triggerPrice);
// }

public double getCommissionPrice() {
return commissionPrice.get();
}

public DoubleProperty commissionPriceProperty() {
return commissionPrice;
}

public void setCommissionPrice(double commissionPrice) {
this.commissionPrice.set(commissionPrice);
}

public int getState() {
return state.get();
}

public IntegerProperty stateProperty() {
return state;
}

public void setState(int state) {
this.state.set(state);
}

public String getOrderSource() {
return orderSource.get();
}

public StringProperty orderSourceProperty() {
return orderSource;
}

public void setOrderSource(String orderSource) {
this.orderSource.set(orderSource);
}
}

顺便说一下这里遇到的坑!!!!!

  1. 定义需要绑定的值时,属性还是用的以前的类型,比如Double类型还是用的Double,但是在javafx中Double变为了javafx中的封装类型DoubleProperty,其它的数据类型应该也是这样;
  2. 实体类我用的随机数进行赋值,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static Double getRandom(int max){
double v = new Random(max).nextDouble();
return v;
}

public static Double getRandom(){
Double random = getRandom(1000);
return random;
}

public static LimitEntrustEntity getLeEntity() {
LimitEntrustEntity leEntity = new LimitEntrustEntity();
leEntity.setCommissionPrice(getRandom());
leEntity.setCommissionQty(getRandom());
leEntity.setCommissionTime(getRandom());
leEntity.setGvm(getRandom());
leEntity.setOrderSource(getRandom().toString());
leEntity.setOrderState(getRandom());
leEntity.setPriceOfOrder(getRandom());
leEntity.setState(getRandom().intValue());
return leEntity;

}

其中的是真的多!,我没有没父类Commission中的属性设置默认值,导致加载数据时为空

4.jpg-33.7kB


第三步,在代码中与fx:id绑定

虽然在fxml文件中设置了fx:id,但是在实际的程序中并没有做任何相关联的绑定,所以这一步就需要进行相关的绑定;

  • 定义数据源
1
private ObservableList<TradeOverviewEntity> exchangeData = FXCollections.observableArrayList();
  • 绑定TableView
1
2
@FXML
private TableView<TradeOverviewEntity> exTable;
  • 绑定列TableColumn
1
2
3
4
5
6
7
8
@FXML
private TableColumn<TradeOverviewEntity, String> coinName;
@FXML
private TableColumn<TradeOverviewEntity, Number> exPrice;
@FXML
private TableColumn<TradeOverviewEntity, Number> exMaxPrice;

//..........省略其它列

加载数据

  • 前面虽然绑定了数据源,但是并没有进行实际的赋值,下面先把值和列对应上
1
2
3
4
5
6
7
8
9
10
 private void initBean(){
lpwtTime.setCellValueFactory(cellData -> cellData.getValue().commissionTimeProperty()); //委托时间
plNumber.setCellValueFactory(cellData -> cellData.getValue().commissionQtyProperty()); //委托数量
plDeal.setCellValueFactory(cellData -> cellData.getValue().orderStateProperty()); //已成交
plPrice.setCellValueFactory(cellData -> cellData.getValue().commissionPriceProperty()); //委托价格
plPrice2.setCellValueFactory(cellData -> cellData.getValue().priceOfOrderProperty()); //成交均价(QC)
plTotal.setCellValueFactory(cellData -> cellData.getValue().commissionTimeProperty()); //成交总额(QC)
plState.setCellValueFactory(cellData -> cellData.getValue().stateProperty()); //状态
plSource.setCellValueFactory(cellData -> cellData.getValue().orderSourceProperty()); //状态
}
  • 对数据进行赋值
1
2
3
4
5
6
private void loadData(){
//随机生成5个订单
for (int i = 0; i < 5; i++) {
limitEntrusData.add(BeanUtils.getLeEntity());
}
}
  • 初始化加载数据
1
2
3
4
5
6
7
@FXML
private void initialize() {
initBean();
loadData();
lpTable.setItems(limitEntrusData);

}

效果

5.jpg-39.5kB

监听TextField变化

目的是为了完成界面简单的密码强度判断,如下界面

1.jpg-14.7kB

绑定fxid

2.jpg-24.5kB

其它的fxid就不一一绑定了

编写监听方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void testyy() {
password.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
//下面是逻辑处理部分
if (password.getText().equals("") || password.getText().length() < 1) {
pwIntensity.setText("登录密码不能为空");
} else {
String intensity = null;
if (password.getText().length() > 5) {
intensity = "强";
} else if (password.getText().length() < 5) {
intensity = "弱";
} else {
intensity = "极强";
}
pwIntensity.setText("密码强度" + intensity);
}
}
});
}

调用监听

监听需要在页面初始化的时候就进行加载,所以在initialize()中吊起

1
2
3
4
@FXML
private void initialize() {
testyy();
}

效果

3.jpg-6.2kB

0%