JavaFX Rubik Cube - cubie selection









up vote
1
down vote

favorite
1












I am trying to build a Rubiks Cube from scratch as my first real app using JavaFx. In the Moves class Im selecting Boxes from ObservableList based on position. The problem is that the Box.getTranslate dosent update so when I try to move the front and the left faces successively the Boxes selected by both are always moved resulting in.. chaos. How could I re-write this so that the Move methods correctly select the boxes to move? Here is the code, work in progress.



Main



package ro.adrianpush;


import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.*;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Box;
import javafx.stage.Stage;



public class Main extends Application

private static final int WIDTH = 800;
private static final int HEIGHT = 600;
final Group root = new Group();


@Override
public void start(Stage primaryStage) throws Exception

Camera camera = new PerspectiveCamera();
camera.translateXProperty().setValue(-200);
camera.translateYProperty().setValue(0);
camera.translateZProperty().set(-500);

AnchorPane pane = new AnchorPane();

Rubik rubik = new Rubik();
ObservableList<Box> boxArrayList = rubik.getBoxArrayList();

for (Box box: boxArrayList
)
pane.getChildren().addAll(box);


primaryStage.addEventHandler(KeyEvent.KEY_PRESSED, event ->
switch (event.getCode())
case E:
Moves.rotateFront(boxArrayList, "clockwise");
break;
case Q:
Moves.rotateFront(boxArrayList, "counterclockwise");
break;
case A:
Moves.rotateLeft(boxArrayList, "clockwise");
break;
case D:
Moves.rotateLeft(boxArrayList, "counterclockwise");
break;


);

root.getChildren().add(pane);
Scene scene = new Scene(root, WIDTH, HEIGHT, true);
scene.setCamera(camera);
scene.setFill(Color.ROYALBLUE);
primaryStage.setTitle("The game nobody wants to play");
primaryStage.setScene(scene);
primaryStage.show();



public static void main(String args)
launch(args);






Rubik



package ro.adrianpush;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.shape.Box;


public class Rubik

private ObservableList<Box> boxArrayList = FXCollections.observableArrayList();


public Rubik()

for(int i = 1; i < 4; i+=1)
for( int j = 1; j < 4; j++)
for(int k = 1; k < 4; k++)

Box box = new Box(100,100,100);
box.setTranslateX(i*100);
box.setTranslateY(j*100);
box.setTranslateZ(k*100);
boxArrayList.add(box);








public ObservableList<Box> getBoxArrayList()
return boxArrayList;






Moves



package ro.adrianpush;


import javafx.collections.ObservableList;
import javafx.scene.shape.Box;
import javafx.scene.transform.Rotate;

public class Moves

public static void rotateFront(ObservableList<Box> boxArrayList, String direction)

for (Box box: boxArrayList
)

if(box.getTranslateZ() == 100)
Rotate rotate = new Rotate();
rotate.setAxis(Rotate.Z_AXIS);
if(direction == "clockwise")
rotate.setAngle(5);
else if (direction == "counterclockwise")
rotate.setAngle(-5);


if(box.getTranslateX() == 100)
rotate.setPivotX(100);
if (box.getTranslateX() == 300)
rotate.setPivotX(-100);
if(box.getTranslateY() == 100)
rotate.setPivotY(100);
if(box.getTranslateY() == 300)
rotate.setPivotY(-100);


box.getTransforms().add(rotate);




public static void rotateBack(ObservableList<Box> boxArrayList, String direction)

for (Box box: boxArrayList
)

if(box.getTranslateZ() == 300)
Rotate rotate = new Rotate();

if(direction == "clockwise")
rotate.setAngle(5);
else if (direction == "counterclockwise")
rotate.setAngle(-5);


if(box.getTranslateX() == 100)
rotate.setPivotX(100);
if (box.getTranslateX() == 300)
rotate.setPivotX(-100);
if(box.getTranslateY() == 100)
rotate.setPivotY(100);
if(box.getTranslateY() == 300)
rotate.setPivotY(-100);


box.getTransforms().add(rotate);




public static void rotateLeft(ObservableList<Box> boxArrayList, String direction)

for (Box box: boxArrayList
)

if(box.getTranslateX() == 100)
Rotate rotate = new Rotate();
rotate.setAxis(Rotate.X_AXIS);

if(direction == "clockwise")
rotate.setAngle(5);
else if (direction == "counterclockwise")
rotate.setAngle(-5);


if(box.getTranslateY() == 100)
rotate.setPivotY(100);
if (box.getTranslateY() == 300)
rotate.setPivotY(-100);
if(box.getTranslateZ() == 100)
rotate.setPivotZ(100);
if(box.getTranslateZ() == 300)
rotate.setPivotZ(-100);


box.getTransforms().add(rotate);













share|improve this question



















  • 1




    You might want to have a look at this take on the task.
    – user1803551
    Nov 11 at 9:56










  • Your for loops are not formatted properly, the ( should be on the same line and usually the { is too.
    – user1803551
    Nov 11 at 10:04











  • As @user1803551 mentioned, that blog post is a good way to start. I discussed about the use of prepend transform instead of add. See also the projects LiteRubikFX and RubikFX, or even Rubiks-cube on mobile. See this for a lighter version of the cube.
    – José Pereda
    Nov 11 at 13:15














up vote
1
down vote

favorite
1












I am trying to build a Rubiks Cube from scratch as my first real app using JavaFx. In the Moves class Im selecting Boxes from ObservableList based on position. The problem is that the Box.getTranslate dosent update so when I try to move the front and the left faces successively the Boxes selected by both are always moved resulting in.. chaos. How could I re-write this so that the Move methods correctly select the boxes to move? Here is the code, work in progress.



Main



package ro.adrianpush;


import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.*;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Box;
import javafx.stage.Stage;



public class Main extends Application

private static final int WIDTH = 800;
private static final int HEIGHT = 600;
final Group root = new Group();


@Override
public void start(Stage primaryStage) throws Exception

Camera camera = new PerspectiveCamera();
camera.translateXProperty().setValue(-200);
camera.translateYProperty().setValue(0);
camera.translateZProperty().set(-500);

AnchorPane pane = new AnchorPane();

Rubik rubik = new Rubik();
ObservableList<Box> boxArrayList = rubik.getBoxArrayList();

for (Box box: boxArrayList
)
pane.getChildren().addAll(box);


primaryStage.addEventHandler(KeyEvent.KEY_PRESSED, event ->
switch (event.getCode())
case E:
Moves.rotateFront(boxArrayList, "clockwise");
break;
case Q:
Moves.rotateFront(boxArrayList, "counterclockwise");
break;
case A:
Moves.rotateLeft(boxArrayList, "clockwise");
break;
case D:
Moves.rotateLeft(boxArrayList, "counterclockwise");
break;


);

root.getChildren().add(pane);
Scene scene = new Scene(root, WIDTH, HEIGHT, true);
scene.setCamera(camera);
scene.setFill(Color.ROYALBLUE);
primaryStage.setTitle("The game nobody wants to play");
primaryStage.setScene(scene);
primaryStage.show();



public static void main(String args)
launch(args);






Rubik



package ro.adrianpush;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.shape.Box;


public class Rubik

private ObservableList<Box> boxArrayList = FXCollections.observableArrayList();


public Rubik()

for(int i = 1; i < 4; i+=1)
for( int j = 1; j < 4; j++)
for(int k = 1; k < 4; k++)

Box box = new Box(100,100,100);
box.setTranslateX(i*100);
box.setTranslateY(j*100);
box.setTranslateZ(k*100);
boxArrayList.add(box);








public ObservableList<Box> getBoxArrayList()
return boxArrayList;






Moves



package ro.adrianpush;


import javafx.collections.ObservableList;
import javafx.scene.shape.Box;
import javafx.scene.transform.Rotate;

public class Moves

public static void rotateFront(ObservableList<Box> boxArrayList, String direction)

for (Box box: boxArrayList
)

if(box.getTranslateZ() == 100)
Rotate rotate = new Rotate();
rotate.setAxis(Rotate.Z_AXIS);
if(direction == "clockwise")
rotate.setAngle(5);
else if (direction == "counterclockwise")
rotate.setAngle(-5);


if(box.getTranslateX() == 100)
rotate.setPivotX(100);
if (box.getTranslateX() == 300)
rotate.setPivotX(-100);
if(box.getTranslateY() == 100)
rotate.setPivotY(100);
if(box.getTranslateY() == 300)
rotate.setPivotY(-100);


box.getTransforms().add(rotate);




public static void rotateBack(ObservableList<Box> boxArrayList, String direction)

for (Box box: boxArrayList
)

if(box.getTranslateZ() == 300)
Rotate rotate = new Rotate();

if(direction == "clockwise")
rotate.setAngle(5);
else if (direction == "counterclockwise")
rotate.setAngle(-5);


if(box.getTranslateX() == 100)
rotate.setPivotX(100);
if (box.getTranslateX() == 300)
rotate.setPivotX(-100);
if(box.getTranslateY() == 100)
rotate.setPivotY(100);
if(box.getTranslateY() == 300)
rotate.setPivotY(-100);


box.getTransforms().add(rotate);




public static void rotateLeft(ObservableList<Box> boxArrayList, String direction)

for (Box box: boxArrayList
)

if(box.getTranslateX() == 100)
Rotate rotate = new Rotate();
rotate.setAxis(Rotate.X_AXIS);

if(direction == "clockwise")
rotate.setAngle(5);
else if (direction == "counterclockwise")
rotate.setAngle(-5);


if(box.getTranslateY() == 100)
rotate.setPivotY(100);
if (box.getTranslateY() == 300)
rotate.setPivotY(-100);
if(box.getTranslateZ() == 100)
rotate.setPivotZ(100);
if(box.getTranslateZ() == 300)
rotate.setPivotZ(-100);


box.getTransforms().add(rotate);













share|improve this question



















  • 1




    You might want to have a look at this take on the task.
    – user1803551
    Nov 11 at 9:56










  • Your for loops are not formatted properly, the ( should be on the same line and usually the { is too.
    – user1803551
    Nov 11 at 10:04











  • As @user1803551 mentioned, that blog post is a good way to start. I discussed about the use of prepend transform instead of add. See also the projects LiteRubikFX and RubikFX, or even Rubiks-cube on mobile. See this for a lighter version of the cube.
    – José Pereda
    Nov 11 at 13:15












up vote
1
down vote

favorite
1









up vote
1
down vote

favorite
1






1





I am trying to build a Rubiks Cube from scratch as my first real app using JavaFx. In the Moves class Im selecting Boxes from ObservableList based on position. The problem is that the Box.getTranslate dosent update so when I try to move the front and the left faces successively the Boxes selected by both are always moved resulting in.. chaos. How could I re-write this so that the Move methods correctly select the boxes to move? Here is the code, work in progress.



Main



package ro.adrianpush;


import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.*;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Box;
import javafx.stage.Stage;



public class Main extends Application

private static final int WIDTH = 800;
private static final int HEIGHT = 600;
final Group root = new Group();


@Override
public void start(Stage primaryStage) throws Exception

Camera camera = new PerspectiveCamera();
camera.translateXProperty().setValue(-200);
camera.translateYProperty().setValue(0);
camera.translateZProperty().set(-500);

AnchorPane pane = new AnchorPane();

Rubik rubik = new Rubik();
ObservableList<Box> boxArrayList = rubik.getBoxArrayList();

for (Box box: boxArrayList
)
pane.getChildren().addAll(box);


primaryStage.addEventHandler(KeyEvent.KEY_PRESSED, event ->
switch (event.getCode())
case E:
Moves.rotateFront(boxArrayList, "clockwise");
break;
case Q:
Moves.rotateFront(boxArrayList, "counterclockwise");
break;
case A:
Moves.rotateLeft(boxArrayList, "clockwise");
break;
case D:
Moves.rotateLeft(boxArrayList, "counterclockwise");
break;


);

root.getChildren().add(pane);
Scene scene = new Scene(root, WIDTH, HEIGHT, true);
scene.setCamera(camera);
scene.setFill(Color.ROYALBLUE);
primaryStage.setTitle("The game nobody wants to play");
primaryStage.setScene(scene);
primaryStage.show();



public static void main(String args)
launch(args);






Rubik



package ro.adrianpush;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.shape.Box;


public class Rubik

private ObservableList<Box> boxArrayList = FXCollections.observableArrayList();


public Rubik()

for(int i = 1; i < 4; i+=1)
for( int j = 1; j < 4; j++)
for(int k = 1; k < 4; k++)

Box box = new Box(100,100,100);
box.setTranslateX(i*100);
box.setTranslateY(j*100);
box.setTranslateZ(k*100);
boxArrayList.add(box);








public ObservableList<Box> getBoxArrayList()
return boxArrayList;






Moves



package ro.adrianpush;


import javafx.collections.ObservableList;
import javafx.scene.shape.Box;
import javafx.scene.transform.Rotate;

public class Moves

public static void rotateFront(ObservableList<Box> boxArrayList, String direction)

for (Box box: boxArrayList
)

if(box.getTranslateZ() == 100)
Rotate rotate = new Rotate();
rotate.setAxis(Rotate.Z_AXIS);
if(direction == "clockwise")
rotate.setAngle(5);
else if (direction == "counterclockwise")
rotate.setAngle(-5);


if(box.getTranslateX() == 100)
rotate.setPivotX(100);
if (box.getTranslateX() == 300)
rotate.setPivotX(-100);
if(box.getTranslateY() == 100)
rotate.setPivotY(100);
if(box.getTranslateY() == 300)
rotate.setPivotY(-100);


box.getTransforms().add(rotate);




public static void rotateBack(ObservableList<Box> boxArrayList, String direction)

for (Box box: boxArrayList
)

if(box.getTranslateZ() == 300)
Rotate rotate = new Rotate();

if(direction == "clockwise")
rotate.setAngle(5);
else if (direction == "counterclockwise")
rotate.setAngle(-5);


if(box.getTranslateX() == 100)
rotate.setPivotX(100);
if (box.getTranslateX() == 300)
rotate.setPivotX(-100);
if(box.getTranslateY() == 100)
rotate.setPivotY(100);
if(box.getTranslateY() == 300)
rotate.setPivotY(-100);


box.getTransforms().add(rotate);




public static void rotateLeft(ObservableList<Box> boxArrayList, String direction)

for (Box box: boxArrayList
)

if(box.getTranslateX() == 100)
Rotate rotate = new Rotate();
rotate.setAxis(Rotate.X_AXIS);

if(direction == "clockwise")
rotate.setAngle(5);
else if (direction == "counterclockwise")
rotate.setAngle(-5);


if(box.getTranslateY() == 100)
rotate.setPivotY(100);
if (box.getTranslateY() == 300)
rotate.setPivotY(-100);
if(box.getTranslateZ() == 100)
rotate.setPivotZ(100);
if(box.getTranslateZ() == 300)
rotate.setPivotZ(-100);


box.getTransforms().add(rotate);













share|improve this question















I am trying to build a Rubiks Cube from scratch as my first real app using JavaFx. In the Moves class Im selecting Boxes from ObservableList based on position. The problem is that the Box.getTranslate dosent update so when I try to move the front and the left faces successively the Boxes selected by both are always moved resulting in.. chaos. How could I re-write this so that the Move methods correctly select the boxes to move? Here is the code, work in progress.



Main



package ro.adrianpush;


import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.*;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Box;
import javafx.stage.Stage;



public class Main extends Application

private static final int WIDTH = 800;
private static final int HEIGHT = 600;
final Group root = new Group();


@Override
public void start(Stage primaryStage) throws Exception

Camera camera = new PerspectiveCamera();
camera.translateXProperty().setValue(-200);
camera.translateYProperty().setValue(0);
camera.translateZProperty().set(-500);

AnchorPane pane = new AnchorPane();

Rubik rubik = new Rubik();
ObservableList<Box> boxArrayList = rubik.getBoxArrayList();

for (Box box: boxArrayList
)
pane.getChildren().addAll(box);


primaryStage.addEventHandler(KeyEvent.KEY_PRESSED, event ->
switch (event.getCode())
case E:
Moves.rotateFront(boxArrayList, "clockwise");
break;
case Q:
Moves.rotateFront(boxArrayList, "counterclockwise");
break;
case A:
Moves.rotateLeft(boxArrayList, "clockwise");
break;
case D:
Moves.rotateLeft(boxArrayList, "counterclockwise");
break;


);

root.getChildren().add(pane);
Scene scene = new Scene(root, WIDTH, HEIGHT, true);
scene.setCamera(camera);
scene.setFill(Color.ROYALBLUE);
primaryStage.setTitle("The game nobody wants to play");
primaryStage.setScene(scene);
primaryStage.show();



public static void main(String args)
launch(args);






Rubik



package ro.adrianpush;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.shape.Box;


public class Rubik

private ObservableList<Box> boxArrayList = FXCollections.observableArrayList();


public Rubik()

for(int i = 1; i < 4; i+=1)
for( int j = 1; j < 4; j++)
for(int k = 1; k < 4; k++)

Box box = new Box(100,100,100);
box.setTranslateX(i*100);
box.setTranslateY(j*100);
box.setTranslateZ(k*100);
boxArrayList.add(box);








public ObservableList<Box> getBoxArrayList()
return boxArrayList;






Moves



package ro.adrianpush;


import javafx.collections.ObservableList;
import javafx.scene.shape.Box;
import javafx.scene.transform.Rotate;

public class Moves

public static void rotateFront(ObservableList<Box> boxArrayList, String direction)

for (Box box: boxArrayList
)

if(box.getTranslateZ() == 100)
Rotate rotate = new Rotate();
rotate.setAxis(Rotate.Z_AXIS);
if(direction == "clockwise")
rotate.setAngle(5);
else if (direction == "counterclockwise")
rotate.setAngle(-5);


if(box.getTranslateX() == 100)
rotate.setPivotX(100);
if (box.getTranslateX() == 300)
rotate.setPivotX(-100);
if(box.getTranslateY() == 100)
rotate.setPivotY(100);
if(box.getTranslateY() == 300)
rotate.setPivotY(-100);


box.getTransforms().add(rotate);




public static void rotateBack(ObservableList<Box> boxArrayList, String direction)

for (Box box: boxArrayList
)

if(box.getTranslateZ() == 300)
Rotate rotate = new Rotate();

if(direction == "clockwise")
rotate.setAngle(5);
else if (direction == "counterclockwise")
rotate.setAngle(-5);


if(box.getTranslateX() == 100)
rotate.setPivotX(100);
if (box.getTranslateX() == 300)
rotate.setPivotX(-100);
if(box.getTranslateY() == 100)
rotate.setPivotY(100);
if(box.getTranslateY() == 300)
rotate.setPivotY(-100);


box.getTransforms().add(rotate);




public static void rotateLeft(ObservableList<Box> boxArrayList, String direction)

for (Box box: boxArrayList
)

if(box.getTranslateX() == 100)
Rotate rotate = new Rotate();
rotate.setAxis(Rotate.X_AXIS);

if(direction == "clockwise")
rotate.setAngle(5);
else if (direction == "counterclockwise")
rotate.setAngle(-5);


if(box.getTranslateY() == 100)
rotate.setPivotY(100);
if (box.getTranslateY() == 300)
rotate.setPivotY(-100);
if(box.getTranslateZ() == 100)
rotate.setPivotZ(100);
if(box.getTranslateZ() == 300)
rotate.setPivotZ(-100);


box.getTransforms().add(rotate);










java javafx observablelist javafx-3d rubiks-cube






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 11 at 13:16









José Pereda

24.3k33764




24.3k33764










asked Nov 11 at 2:47









Adrian Puşcuţă

63




63







  • 1




    You might want to have a look at this take on the task.
    – user1803551
    Nov 11 at 9:56










  • Your for loops are not formatted properly, the ( should be on the same line and usually the { is too.
    – user1803551
    Nov 11 at 10:04











  • As @user1803551 mentioned, that blog post is a good way to start. I discussed about the use of prepend transform instead of add. See also the projects LiteRubikFX and RubikFX, or even Rubiks-cube on mobile. See this for a lighter version of the cube.
    – José Pereda
    Nov 11 at 13:15












  • 1




    You might want to have a look at this take on the task.
    – user1803551
    Nov 11 at 9:56










  • Your for loops are not formatted properly, the ( should be on the same line and usually the { is too.
    – user1803551
    Nov 11 at 10:04











  • As @user1803551 mentioned, that blog post is a good way to start. I discussed about the use of prepend transform instead of add. See also the projects LiteRubikFX and RubikFX, or even Rubiks-cube on mobile. See this for a lighter version of the cube.
    – José Pereda
    Nov 11 at 13:15







1




1




You might want to have a look at this take on the task.
– user1803551
Nov 11 at 9:56




You might want to have a look at this take on the task.
– user1803551
Nov 11 at 9:56












Your for loops are not formatted properly, the ( should be on the same line and usually the { is too.
– user1803551
Nov 11 at 10:04





Your for loops are not formatted properly, the ( should be on the same line and usually the { is too.
– user1803551
Nov 11 at 10:04













As @user1803551 mentioned, that blog post is a good way to start. I discussed about the use of prepend transform instead of add. See also the projects LiteRubikFX and RubikFX, or even Rubiks-cube on mobile. See this for a lighter version of the cube.
– José Pereda
Nov 11 at 13:15




As @user1803551 mentioned, that blog post is a good way to start. I discussed about the use of prepend transform instead of add. See also the projects LiteRubikFX and RubikFX, or even Rubiks-cube on mobile. See this for a lighter version of the cube.
– José Pereda
Nov 11 at 13:15

















active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













 

draft saved


draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53245417%2fjavafx-rubik-cube-cubie-selection%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown






























active

oldest

votes













active

oldest

votes









active

oldest

votes






active

oldest

votes















 

draft saved


draft discarded















































 


draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53245417%2fjavafx-rubik-cube-cubie-selection%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







這個網誌中的熱門文章

How to read a connectionString WITH PROVIDER in .NET Core?

Museum of Modern and Contemporary Art of Trento and Rovereto

In R, how to develop a multiplot heatmap.2 figure showing key labels successfully