Timer 如何让舞台在计时器后显示图片
单击“开始”按钮后,我的程序将不会显示第二个场景和线程,直到线程完成。线程将无法正确运行(草没有增加)Timer 如何让舞台在计时器后显示图片,timer,javafx,Timer,Javafx,单击“开始”按钮后,我的程序将不会显示第二个场景和线程,直到线程完成。线程将无法正确运行(草没有增加) 公共类test111扩展了应用程序{ 私有静态int_i=130; 私有静态int_j=200; 私有静态int[]map=newint[grass_i][grass_j]//草地資料格拉斯数据 私有静态整型totalgrass;//草总数 私有静态整型totalgrassrest;//GrassRest编号 私人静态整数月=1//月 私人定时器//時間 //桂 场景菜单; //开始後的視窗
公共类test111扩展了应用程序{
私有静态int_i=130;
私有静态int_j=200;
私有静态int[]map=newint[grass_i][grass_j]//草地資料格拉斯数据
私有静态整型totalgrass;//草总数
私有静态整型totalgrassrest;//GrassRest编号
私人静态整数月=1//月
私人定时器//時間
//桂
场景菜单;
//开始後的視窗
BorderPane bpAll=新的BorderPane();
窗格播放视图=新建窗格();
场景mainsc=新场景(bpAll);
//草
Image littlegrassImg=新图像(getClass().getResourceAsStream(“map_littlegrass.png”);
Image midiumgrassImg=新图像(getClass().getResourceAsStream(“map_midiumgrass.png”);
Image muchgrassImg=新图像(getClass().getResourceAsStream(“map_muchgrass.png”);
矩形2D[][]视口矩形=新矩形2D[130][200];
私有静态ImageView[][]映射视图=新ImageView[130][200];
//時間
@凌驾
public void start(Stage primaryStage)抛出中断异常{
//菜单
窗格菜单=新建窗格();
menusc=新场景(菜单);
menu.setPrefSize(1000800);
Image MenuImg=新图像(getClass().getResourceAsStream(“Menu_title.jpg”);
Image StartImg=新图像(getClass().getResourceAsStream(“Start.jpg”);
menu.getChildren().add(newimageview(MenuImg));
按钮StartBt=新按钮();
开始设置预大小(450150);
StartBt.setGraphic(新图像视图(StartImg));
StartBt.setMaxSize(450150);
开始设置布局X(300);
开始设置布局(600);
menu.getChildren().addAll(新图像视图(MenuImg),StartBt);
初生阶段:最低高度(800)//固定視窗大小确定舞台的大小
初级阶段设置最小宽度(1000)//固定視窗大小确定舞台的大小
初级阶段设置最大高度(800)//固定視窗大小确定舞台的大小
初级阶段设置最大宽度(1000)//固定視窗大小确定舞台的大小
初生阶段:西新世(menusc);
初级阶段。片名(“海普诺斯的院子”);
//开始
开始设置操作(e->{
边界窗格bp2=bp2();
menusc=新场景(bp2);
初生阶段:西新世(menusc);
});
primaryStage.show();
}
公共边界窗格bp2(){
播放视图=播放视图();
bpAll=新边框窗格();
bpAll.setPrefSize(1000800);
playView.setPrefSize(1000650)//庭院
bpAll.setTop(播放视图);
Random ran=新的Random();
totalgrass=(ran.nextInt(50)*1000)+48000;
totalgrassrest=totalgrass;
grasscreate();
//設定初始草地建造最初的草地
grassGraphicsLoading();//加载草地图片
返回bpAll;
}
公共窗格播放视图(){
playView=新窗格();
而(在我点击开始按钮后的一个月,我的程序将不会显示第二个场景和线程,直到线程完成。线程将无法正确运行(草没有增加)。请解释您试图实现的目标和结果。不要为此任务使用计时器和线程,请使用.Post。我只想模拟一个正在生长草的区域。首先,您将看到一个菜单和一个“开始”按钮,单击“开始”,然后将进入一个新场景(menusc=新场景(bp2)),并将构建初始草数据(grasscreate())。方法“Pane playView()”是我想做的主要功能。在这个方法中,我想在程序中模拟一个月0.2s。方法“month()”是增加草的数量(一个月后),方法“grassGraphicsLoading()”是将grass数据转换为ImageView..RE jewelsea,对不起,我已经简化了我的代码。我不知道哪行是错的,所以我不能发布最小的示例。
public class test111 extends Application {
private static int grass_i=130;
private static int grass_j=200;
private static int[][] map = new int[grass_i][grass_j];//草地資料grassdata
private static int totalgrass; //grass total number
private static int totalgrassrest; //grass rest number
private static int months=1; //月
private Timer timer;//時間
//GUI
Scene menusc ;
//START後的視窗
BorderPane bpAll = new BorderPane();
Pane playView = new Pane();
Scene mainsc = new Scene(bpAll);
//草
Image littlegrassImg = new Image(getClass().getResourceAsStream("map_littlegrass.png"));
Image midiumgrassImg = new Image(getClass().getResourceAsStream("map_midiumgrass.png"));
Image muchgrassImg = new Image(getClass().getResourceAsStream("map_muchgrass.png"));
Rectangle2D[][] viewportRect = new Rectangle2D[130][200];
private static ImageView[][] mapView = new ImageView[130][200];
//時間
@Override
public void start(Stage primaryStage) throws InterruptedException {
//MENU
Pane menu = new Pane();
menusc = new Scene(menu);
menu.setPrefSize(1000, 800);
Image MenuImg = new Image(getClass().getResourceAsStream("Menu_title.jpg"));
Image StartImg = new Image(getClass().getResourceAsStream("Start.jpg"));
menu.getChildren().add(new ImageView(MenuImg));
Button StartBt = new Button();
StartBt.setPrefSize(450, 150);
StartBt.setGraphic(new ImageView(StartImg));
StartBt.setMaxSize(450, 150);
StartBt.setLayoutX(300);
StartBt.setLayoutY(600);
menu.getChildren().addAll(new ImageView(MenuImg),StartBt);
primaryStage.setMinHeight(800);//固定視窗大小fix the size of Stage
primaryStage.setMinWidth(1000);//固定視窗大小fix the size of Stage
primaryStage.setMaxHeight(800);//固定視窗大小fix the size of Stage
primaryStage.setMaxWidth(1000);//固定視窗大小fix the size of Stage
primaryStage.setScene(menusc);
primaryStage.setTitle("Hypnos' yard");
//START
StartBt.setOnAction(e->{
BorderPane bp2 = bp2();
menusc = new Scene(bp2);
primaryStage.setScene(menusc);
});
primaryStage.show();
}
public BorderPane bp2(){
playView = playView();
bpAll = new BorderPane();
bpAll.setPrefSize(1000, 800);
playView.setPrefSize(1000, 650); //庭院
bpAll.setTop(playView);
Random ran = new Random();
totalgrass = (ran.nextInt(50)*1000)+48000;
totalgrassrest = totalgrass;
grasscreate();
//設定初始草地construct the initial grass
grassGraphicsLoading(); //loading grass pictures
return bpAll;
}
public Pane playView(){
playView = new Pane();
while(months<12){
timer = new Timer();
TimerTask task = new TimerTask(){
public void run(){
month();
}
};//after program executing 0.2s, a month past
timer.schedule(task, 200);
try {
Thread.sleep(200);
}
catch(InterruptedException e6) {
}
timer.cancel();
}
return playView;
}
//月month
protected void month(){
if(months<13){
grassgrow(totalgrass*2);//grass growth
Platform.runLater(new Runnable(){
@Override
public void run(){
grassGraphicsLoading();
}
});
months++;
}
}
//把草地資料帶入圖形loading grass pictures
private void grassGraphicsLoading(){
for (int i = 0; i < grass_i; i++) { // 設定imageView的圖形和位置
for (int j = 0; j < grass_j; j++) {
viewportRect[i][j] = new Rectangle2D(j * 5, i * 5, 5, 5);
if (170 <= j && j <= grass_j - 1) {
mapView[i][j] = new ImageView(muchgrassImg);
} else if (140 <= j && j < 170) {
mapView[i][j] = new ImageView(muchgrassImg);
} else {
if (map[i][j] == 0) {
mapView[i][j] = new ImageView(littlegrassImg);
} else if (map[i][j] == 1 || map[i][j] == 2) {
mapView[i][j] = new ImageView(midiumgrassImg);
} else {
mapView[i][j] = new ImageView(muchgrassImg);
}
}
playView.getChildren().add(mapView[i][j]);
mapView[i][j].setViewport(viewportRect[i][j]);
mapView[i][j].setX(j * 5);
mapView[i][j].setY(i * 5);
}
}
}
public static void main(String[] args) {
launch(args);
}
// 每經過30天(一個月)草地+1grassgrowth
protected void grassgrow(int sum) {
for (int i = 0; i < grass_i; i++) {
for (int j = grass_j - 1; j >= 0; j--) {
if (map[i][j] < 4 && totalgrass <sum) {
map[i][j] += 1;
totalgrass++;
}
if (totalgrass == 104000||totalgrass ==sum) {
break;
}
}
}
}
//建構草地construct grass
protected void grasscreate() {
for (int j = grass_j - 1; j >= 0; j--) {
for (int i = grass_i - 1; i >= 0; i--) {
if (170 <= j && j <= grass_j - 1) {
map[i][j] = 0;
} else if (140 <= j && j < 170) {
map[i][j] = 4;
totalgrassrest -= 4;
} else if (totalgrassrest <= 0) {
map[i][j] = 0;
} else if (4 * (j + 1) * grass_i <= totalgrassrest) {
map[i][j] = 4;
totalgrassrest -= 4;
} else if (totalgrassrest < 4) {
map[i][j] = totalgrassrest;
totalgrassrest = 0;
} else {
map[i][j] = rancreate();
totalgrassrest -= map[i][j];
}
}
}
totalgrass -= totalgrassrest;
totalgrassrest = 0;
}
// 一格(5X5)內草地數量隨機1-4平米z there is 1-4 grass inside a rectangle
private int rancreate() {
Random ran = new Random();
int grass = ran.nextInt(5);
return grass;
}