Я пытаюсь написать простую игру-головоломку на JavaFX. Я хочу, чтобы изображение было разрезано на части, а затем я бы хотел поменять их местами, когда я нажал на них. Проблема заключается в решении, которое я использовал для работы, когда все было в Main (так как я создал другую сцену в main, а затем переключился на нее). Я попытался сделать код немного чище, поэтому я создал еще один файл FXML и контроллер для него. Я также ранее использовал кнопки вместо ImageViewers. Может ли это быть проблемой?
Я вижу, что некоторые люди говорят, что в ImageViewer нет свойства OnAction. Но некоторые получили это работает. Должен ли я просто сдаться и использовать кнопки?
public class Grid implements Initializable{
public Image done;
public BufferedImage orgin;
public BufferedImage bwhite;
public Image iwhite;
public Image[][] arr =new Image[6][6];
public ImageView [][]iv = new ImageView[6][6];
public GridPane gridPane;
public ImageView tmp1=new ImageView(iwhite);
public ImageView special= tmp1;
@FXML
private AnchorPane Magic;
private void switcher()
{
gridPane.getChildren().forEach(button-> button.setOnMouseClicked(
event -> {
swap(button, special);
System.out.println("sth");
}
));
}
public static void swap(Node n1, Node n2) {
Integer temp = GridPane.getRowIndex(n1);
GridPane.setRowIndex(n1, GridPane.getRowIndex(n2));
GridPane.setRowIndex(n2, temp);
temp = GridPane.getColumnIndex(n1);
GridPane.setColumnIndex(n1, GridPane.getColumnIndex(n2));
GridPane.setColumnIndex(n2, temp);
}
void imgloader() throws Exception
{
int rand = (int)(Math.random() * 0)+1;
if (rand==1) orgin= ImageIO.read(new File("C:\\Users\\PC\\Desktop\\untitled\\image1.jpg"));
bwhite= ImageIO.read(new File("C:\\Users\\PC\\Desktop\\untitled\\white.jpg"));
}
void imagesplitter()
{
int val=Difficoulty.diffval;
int block = 300/val;
for (int i=0; i<val; i++)
{
for (int j=0; j<val; j++)
{
BufferedImage tmp= orgin.getSubimage(j*block,i*block,block,block);
BufferedImage tmpwhite= bwhite.getSubimage(j*block,i*block,block,block);
done = SwingFXUtils.toFXImage(tmp, null );
iwhite = SwingFXUtils.toFXImage(tmpwhite, null );
arr[i][j]=done;
}
}
}
@FXML
void initialize() {
assert Magic != null : "fx:id=\"Magic\" was not injected: check your FXML file 'Grid.fxml'.";
}
@Override
public void initialize(URL location, ResourceBundle resources) {
gridPane = new GridPane();
switcher();
try {
imgloader();
} catch (Exception e) {
e.printStackTrace();
}
imagesplitter();
gridPane.setMinSize(300, 300);
gridPane.setPadding(new Insets(10, 10, 10, 10));
int val = Difficoulty.diffval;
for (int i=0; i<val; i++)
{
for (int j=0; j<val; j++)
{
ImageView iv1=new ImageView(arr[j][i]);
iv[i][j] = iv1;
if (i==val-1 && j==val-1)
{
}
else
{
gridPane.add(iv[i][j],j,i);
}
}
}
gridPane.add(special,val-1,val-1);
Magic.getChildren().addAll(gridPane);
}
@FXML private void MainMenu(ActionEvent event) throws Exception{
Parent newparent = FXMLLoader.load(getClass().getResource("sample.fxml"));
Scene newscene = new Scene(newparent);
Stage window = (Stage)((Node)event.getSource()).getScene().getWindow();
window.setScene(newscene);
window.show();
}
}