使用Java FXML生成大型GridPane

问题描述 投票:0回答:2

嗨,我是FXML的新手,也是JavaFX的新手。

如标题中所述,我想创建一个包含64个以上单元格的GridPane。我的问题是:

我是否必须为这64个以上的单元格编写所有代码,或者有一种方法(如for循环)来生成它们?

这是我的代码。我的计划是拥有一个8x8(也许更多)草细胞网格。

草类

package auto;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;

public class Grass extends Ground{

    public Grass(){
        ground= new Rectangle(50,50,Color.GREEN);
    }   
}

地面类

package auto;

import javafx.scene.shape.Rectangle;


public abstract class Ground {
    protected Rectangle ground;
}

FXML文件

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.shape.*?>
<?import javafx.geometry.*?>

<StackPane   alignment="CENTER"
   xmlns:fx="http://javafx.com/fxml"
   fx:controller="auto.FXMLDocumentController"
> 
     <Rectangle fx:id="Back" id="Back" height="700" width="500" />
     <VBox id="APP" prefWidth="450" maxWidth="450" minWidth="450"  >
          <StackPane style="-fx-border-color: green; -fx-border-width: 2px;">
              <Rectangle id="menu-style" height="50" width="450"/>

              <HBox id="Menu"> 
                 <Button text="Start"/>
                 <Label> Current Cars</Label>
                 <Button text="Add Car"/>  
              </HBox>

          </StackPane>
         <GridPane id="Game" fx:id="Game">
         //8x8 grid of Grass 

         </GridPane>
     </VBox> 
</StackPane>

主要Java代码

package auto;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;


public class RaceGame extends Application {

    @Override
    public void start( Stage stage ) throws Exception {

       stage.setTitle("Race Game");
       Parent root =FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
       String css = this.getClass().getResource("RaceGame.css").toExternalForm();
       Scene scene = new Scene(root);
       scene.getStylesheets().add(css);
       stage.setScene(scene);
       stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main( String[] args ) {
        launch(args);
    }

}

编辑#1

我尝试使用控制器。问题是Grass不是Node。

package auto;


import javafx.fxml.FXML;
import javafx.scene.layout.GridPane;

public class FXMLDocumentController  {

    @FXML
    private GridPane Game;

    public FXMLDocumentController() {
        for(int i=0;i<8;i++){
           for(int j=0;j<8;j++){
               Game.add(new Grass(), i, j);
           }
        }

    }

}
java javafx fxml
2个回答
0
投票

回答

我用这种方式解决了这个问题:


  1. 使用Controller生成网格,更准确地说是initialize()方法。与FXML控制器类的构造函数不同,initialize方法可以使用所有@FXML引用,因为它们是在构造函数之后和initialize方法之前加载的。
  2. 声明Ground extends Rectangle,以便网格可以接受地面对象。现在Ground是一个节点,可以添加到网格中。

地面类

package auto;

import javafx.scene.shape.Rectangle;

public abstract class Ground extends Rectangle{
}

草课

package auto;

import javafx.scene.paint.Color;

public class Grass extends Ground{

    Grass(){
       this.setWidth(50);
       this.setHeight(50);
       this.setFill(Color.GREEN);
    }      
}

FXML文件

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.shape.*?>
<?import javafx.geometry.*?>

<StackPane   alignment="CENTER"
    xmlns:fx="http://javafx.com/fxml"
    fx:controller="auto.FXMLDocumentController"
> 
<Rectangle fx:id="Back" id="Back" height="700" width="500" />
<VBox id="APP" prefWidth="450" maxWidth="450" minWidth="450"  >
    <StackPane style="-fx-border-color: green; -fx-border-width: 2px;">
        <Rectangle id="menu-style" height="50" width="450"/>

        <HBox id="Menu"> 
            <Button text="Start"/>
            <Label> Current Cars</Label>
            <Button text="Add Car"/>  
        </HBox>
    </StackPane>
    <GridPane id="Game" fx:id="Game">


    </GridPane>
</VBox> 
</StackPane>

FXML控制器

package auto;


import javafx.fxml.FXML;

import javafx.scene.layout.GridPane;

public class FXMLDocumentController  {

    @FXML
    private GridPane Game;

    public void initialize() {
        for(int i=0;i<8;i++){
           for(int j=0;j<8;j++){
               Game.add(new Grass(), i, j);
           }
        }

    }

}

0
投票

我知道你似乎已经自己回答了这个问题但是我会把它留在这里,无论如何你似乎已经使这个问题复杂化了

import javafx.fxml.Initializable;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;

import java.net.URL;
import java.util.ResourceBundle;


public class FXMLDocumentController implements Initializable {

    public Rectangle Back;
    public GridPane Game;

    private void createGrass(){
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){
                Game.add(new Rectangle(50,50, Color.GREEN), i, j);
            }
        }
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        createGrass();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.