javafx Массив изображений, отображаемых в произвольном порядке BINGO - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь получить список изображений для отображения в сетке 5x5. Я не могу понять, в чем проблема.

Это инструкции по назначению: Назначение:

Создать образ БИНГО. Используя упражнение 14.1 стр. 586 в качестве основы: напишите программу, которая случайным образом отображает изображения на карточке Бинго. Это должна быть сетка 5X5 с буквами B I N G O сверху.

//package
package javafxapplication2;
//import
import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.Pos;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.scene.image.ImageView;
import javafx.scene.image.Image;

/**
 *
 * @author travis.dutton
 */
public class JavaFXApplication2 extends Application {
  @Override // Override the start method in the Application class
  public void start(Stage primaryStage) {

    GridPane pane = new GridPane();
    pane.setAlignment(Pos.CENTER);
    pane.setHgap(5);
    pane.setVgap(5);

    ImageView flags[];
    flags = new ImageView[25];

    flags[0] = new ImageView("images/1.png");
    flags[1] = new ImageView("images/2.jpg");
    flags[2] = new ImageView("images/3.gif");
    flags[3] = new ImageView("images/4.gif");
    flags[4] = new ImageView("images/5.jpg");
    flags[5] = new ImageView("images/6.png");
    flags[6] = new ImageView("images/7.gif");
    flags[7] = new ImageView("images/8.jpg");
    flags[8] = new ImageView("images/9.png");
    flags[9] = new ImageView("images/10.png");
    flags[10] = new ImageView("images/11.jpg");
    flags[11] = new ImageView("images/12.png");
    flags[12] = new ImageView("images/13.png");
    flags[13] = new ImageView("images/14.png");
    flags[14] = new ImageView("images/15.png");
    flags[15] = new ImageView("images/16.png");
    flags[16] = new ImageView("images/17.gif");
    flags[17] = new ImageView("images/18.gif");
    flags[18] = new ImageView("images/19.png");
    flags[19] = new ImageView("images/20.jpg");
    flags[20] = new ImageView("images/21.png");
    flags[21] = new ImageView("images/22.png");
    flags[22] = new ImageView("images/23.png");
//    flags[23] = new ImageView("images/24.gif");
//    flags[24] = new ImageView("images/25.png");

//    pane.add(flags[0], 0, 0);
//    pane.add(imageView2, 1, 0);
//    pane.add(imageView3, 0, 1);
//    pane.add(imageView4, 1, 1);

//  for(int i = 0; i < flags.length; i++){
//       
//       GridPane.setRowIndex(flags[i],1);
//       GridPane.setColumnIndex(flags[i],i);
//       pane.getChildren().add(flags[i]);
//    }

    for(int i = 0; i < 5; i++){
        for (int j = 0; j < 5; j++) {
            ImageView image = new ImageView();
            image.setColumnIndex(1);
            image.getChildren(String.valueOf(flags));
            pane.add(image, i, j);

        }
    }




       // Create a scene and place it in the stage
    Scene scene = new Scene(pane);
    primaryStage.setTitle("Exercise14_01"); // Set the stage title
    primaryStage.setScene(scene); // Place the scene in the stage
    primaryStage.show(); // Display the stage
  }



  /**
   * The main method is only needed for the IDE with limited
   * JavaFX support. Not needed for running from the command line.
   */
  public static void main(String[] args) {
    launch(args);//launch javafx
  }//end main
}//end of class

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

ImageView не предоставляет метод getChildren. (Я не знаю класс JavaFX, который предоставляет класс, который принимает параметр String между прочим). ImageView s являются узлами и должны быть помещены в GridPane напрямую, используя метод GridPane.add(Node, int, int).

Вы можете использовать Collections.shuffle для генерации премутации:

String[] images = new String[] {
    "images/1.png",
    "images/2.jpg",
    ...
    "images/25.png"
};

// using a list with indices here to keep the original index order intact.
// (You could use a list of String and shuffle it otherwise)
List<Integer> permutation = IntStream.range(0, images.length).boxed().collect(Collectors.toCollection(ArrayList::new));
Collections.shuffle(permutation);

for(int i = 0, index = 0; i < 5; i++){
    for (int j = 1; j <= 5; j++) {
        ImageView image = new ImageView(images[permutation.get(index)]);
        pane.add(image, i, j);
        index++;
    }
}

// bingo accross the top (not sure if this is what was asked for)
pane.add(new Label("Bingo"), 0, 0, 5, 1);
0 голосов
/ 17 ноября 2018

Если вы хотите поместить случайные изображения в GridPane, например:

enter image description here

, вы должны сделать что-то вроде этого:

    final ArrayList<ImageView> flags = new ArrayList<>();

    flags.add(new ImageView("images/1.png"));
    flags.add(new ImageView("images/2.png"));
    flags.add(new ImageView("images/3.png"));
    // add flags

     for (int columnIndex = 0; columnIndex < 5; i++) {
        for (int rowIndex = 0; rowIndex < 5; j++) {
            if(isNotBingoCell(columnIndex, rowIndex)) { //check that cell is not BINGO cell
                final int imageIndex = Objects.equals(flags.size(), 1)
                        ? 0
                        : ThreadLocalRandom.current().nextInt(0, flags.size() - 1);
                pane.add(flags.get(imageIndex), columnIndex, rowIndex);
                flags.remove(imageIndex);
                flags.trimToSize();
            }
        }
    }

, isNotBingoCell(...) Реализация:

    private boolean isNotBingoCell(int columnIndex, int rowIndex) {
        return !Objects.equals(columnIndex, rowIndex);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...