程序运行如下:
先设置时间间隔,然后点击开始 ,生成输入后,点击停止 也会停止,但是再次点击开始会抛出如图异常。
请各位大神帮忙解决.
(知道可以用util工具Timer,Timer;但如何不用工具类,只用线程。)
代码如下 :
---1.显示界面
package addData;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TestView extends Application{
public void start(Stage stage) throws Exception {
TableFX table = new TableFX();
VBox vb = table.createStage();
Scene scene = new Scene(vb);
stage.setTitle("定时添加数据");
stage.setWidth(600);
stage.setHeight(400);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
---2.用线程自制定时器
package addData;
public abstract class ThreadTimer extends Thread{
private boolean flag;
private int time;
public void run(){
while(true){
if(flag){
doThing();
try {
Thread.sleep(time*1000);
} catch (InterruptedException e) {
System.out.println("线程被中断");
}
}
}
}
public abstract void doThing();
public ThreadTimer() {
super();
}
public ThreadTimer(boolean flag) {
super();
this.flag = flag;
}
public ThreadTimer(int time) {
super();
this.time = time;
}
public ThreadTimer(boolean flag, int time) {
super();
this.flag = flag;
this.time = time;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
}
---3.实现按钮事件操控线程定时器
package addData;
import test3.MyTest.StringModel;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
public class TableFX extends ThreadTimer{
HBox hb = new HBox();
Button start = new Button("开始");
Button stop = new Button("停止");
Label intervalLabel = new Label("时间间隔(秒)");
TextField interval = new TextField();
TableView<StringModel> table = new TableView<StringModel>();
ObservableList<StringModel> data = FXCollections.observableArrayList(new StringModel("11","aa"));
public void doThing() {
System.out.println("正在添加数据");
data.addAll(new StringModel("aa"+Math.random()*100, "bb"));
}
public VBox createStage(){
//设置2个按钮,1个文本框
hb.setSpacing(15);
hb.setAlignment(Pos.CENTER);//设置box中控件居中
hb.getChildren().addAll(start,stop,interval,intervalLabel);
//设置按钮事件
start.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
setTime(Integer.parseInt(interval.getText()));
setFlag(true);
start();
}
});
stop.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
setFlag(false);
}
});
//设置显示记录的表格
TableColumn tc1 = new TableColumn("消息记录");
tc1.setMinWidth(400);
tc1.setMaxWidth(400);
tc1.setCellValueFactory(new PropertyValueFactory<>("str1"));
table.setItems(data);
table.getColumns().addAll(tc1);
//把HBox和 TableView 放进 VBox
VBox vb = new VBox();
vb.setSpacing(10);
vb.setPadding(new Insets(10,10,10,10));
vb.getChildren().addAll(hb,table);
return vb;
}
}