如何使用内部类填充flowpane; JavaFX的

时间:2016-01-31 16:38:33

标签: java javafx

我尝试使用从Rectangle继承的一些正方形填充FlowPane。当我运行下面的代码时,窗口是空白的。 FlowPane没有显示我尝试添加的任何Squares。谁能帮我理解为什么?

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.FlowPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;

public class NonoView extends Application{
    private Square[] sqs;
    @Override
    public void start(Stage primaryStage) {
        sqs = new Square[5];
        for(int i = 0; i < sqs.length; i++){
            sqs[i] = new Square();
        }

        FlowPane root = new FlowPane();
        root.getChildren().addAll(sqs);
        Scene scene = new Scene (root, 200, 200);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    class Square extends Rectangle{
        Square(){
            Rectangle sq = new Rectangle(100, 100);
            sq.setFill(Color.WHITE);
            sq.setStroke(Color.BLACK);
            sq.setOnMouseClicked(e -> {
                System.out.println(e.getButton().getClass());
                if(e.getButton().equals(MouseButton.PRIMARY)){
                    if(sq.getFill() == Color.WHITE){
                        sq.setFill(Color.BLUE);
                    }else {
                        sq.setFill(Color.WHITE);
                    }
                }

            });
        }
    }
    public static void main(String[] args){
        Application.launch(args);
    }

1 个答案:

答案 0 :(得分:3)

您的Square类并没有真正扩展Rectangle,因为您打算:在构造函数中创建一个不属于外部作用域的矩形实例,它只存在于构造函数中

像这样重写构造函数,你应该没问题:

class Square extends Rectangle{
        Square(){
           super(100, 100);
            setFill(Color.WHITE);
            setStroke(Color.BLACK);
            setOnMouseClicked(e -> {
                System.out.println(e.getButton().getClass());
                if(e.getButton().equals(MouseButton.PRIMARY)){
                    if(getFill() == Color.WHITE){
                        setFill(Color.BLUE);
                    }else {
                        setFill(Color.WHITE);
                    }
                }    
            });
        }
}