JavaFX-使用字符输入定位图像

时间:2019-05-08 12:38:00

标签: java javafx

我有一个GUI,用于输入图像名称,一旦按下刷新按钮,它就会显示在固定位置。我希望能够输入将更改图像的X位置的字符“ A-G”和将更改图像的Y位置的字符“ 0-6”。图像的名称仅为“ A1”,“ A2” ...“ A5”。因此,如果用户输入“ A1B3”,它将在X位置“ B”和Y位置“ 3”中显示图像A1。因此B可以是200,而3可以是300,这使得(X,Y)坐标为(200,300)。

这是我的代码,可让用户输入图像。

private void getImage(){
    Image img = new Image("comp1110/ass2/gui/assets/" + textField.getText() + ".png", 100, 100, false, false);

    ImageView image = new ImageView();
    image.setImage(img);
    image.setX(100);
    image.setY(100);
    pane.getChildren().add(image);
}

1 个答案:

答案 0 :(得分:1)

我认为您应该按照这种方式做一些事情,是的,您需要解决一些外观问题。但这只是让您知道该怎么做。它使用了网格窗格,因此您不必担心获取精确的坐标,而我选择了vbox,因此不必担心布局,可以让窗格保持不变。

public class Main extends Application {

    private GridPane gridPane;
    private TextField imageTextField = new TextField();
    private HashMap<String,String> hashMap = new HashMap<>();

    @Override
    public void start(Stage primaryStage) {
        fillHashMapValues();

        gridPane = new GridPane();
        gridPane.setGridLinesVisible(true);
        for (int i = 0; i < 7; i++) {
            RowConstraints rowConstraints = new RowConstraints();
            rowConstraints.setPercentHeight(14);
            gridPane.getRowConstraints().add(rowConstraints);

            ColumnConstraints columnConstraints = new ColumnConstraints();
            columnConstraints.setPercentWidth(14);
            gridPane.getColumnConstraints().add(columnConstraints);

            gridPane.addColumn(i);
            gridPane.addRow(i);
        }

        imageTextField.setPromptText("Enter Image Letters?");

        TextField textField = new TextField();
        textField.setPromptText("Enter Coordinates");

        Button button = new Button("Go!");
        button.setOnAction(event -> {
            addToGridPane(textField.getText());
        });

        VBox vBox = new VBox();
        vBox.setPrefSize(300, 300);
        vBox.setAlignment(Pos.TOP_CENTER);
        vBox.getChildren().addAll(imageTextField, textField, button, gridPane);

        primaryStage.setScene(new Scene(vBox));
        primaryStage.show();
        button.requestFocus();//This is only so you can see the prompt text its irrelevant
    }

    private void fillHashMapValues(){
        hashMap.put("A", "1");
        hashMap.put("B", "2");
        hashMap.put("C", "3");
        hashMap.put("D", "4");
        hashMap.put("E", "5");
        hashMap.put("F", "6");
        hashMap.put("G", "7");
    }

    private void addToGridPane(String string){
        char[] chars = string.toCharArray();
        if(chars.length==2){//Do more data validation here
            if(hashMap.containsKey(String.valueOf(chars[0]))) {
                int xValue = Integer.parseInt(hashMap.get(String.valueOf(chars[0])));
                int yValue = Integer.parseInt(String.valueOf(chars[1]));

                ImageView image = getImage();

                gridPane.add(image, xValue, yValue);
            }
        }
    }

    private ImageView getImage(){
        Image image = new Image("comp1110/ass2/gui/assets/" + imageTextField.getText() + ".png", 100, 100, false, false);

        ImageView imageView = new ImageView();
        imageView.setImage(image);
        //imageView.setX(100);
        //imageView.setY(100);
        //pane.getChildren().add(image);
        return imageView;
    }

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