вторая кнопка в моей игре не отображается

#java #javafx

#java #javafx

Вопрос:

Я новичок в JavaFX, и у меня возникла проблема. Я хочу, чтобы пользователь мог каждый раз окрашивать только две кнопки из кнопок 2X2, а кнопки 2X2 сбрасываются только после второго нажатия или когда пользователь решил нажать кнопку сброса, после чего он может выбрать еще 2 кнопки, но после нажатия на во-вторых, вторая кнопка не окрашивается, и все кнопки 2X2 были сброшены, только первая была окрашена.

 public class ColorGame extends Application {

    int onlyTwoSelection = 0;//allowing user to clicke 2 times
    ArrayList<Integer> buttonId = new ArrayList<Integer>(); //Storing the last 2 button clicked Id

    @Override
    public void start(Stage primaryStage) throws Exception {
        Button blankButton[] = new Button[4];//uncolored buttons
        Button reset = new Button("Reset");//Reset all buttons to the first state 
        HBox hbox = new HBox();//Storing Reset
        BorderPane borderPane = new BorderPane();
        GridPane gridpane = new GridPane();
            

        for (int i = 0; i < 4; i  ) {//This for loop setting all Buttons
            blankButton[i] = new Button();
            blankButton[i].setMinSize(170, 110);
            blankButton[i].setStyle(null);
        }   
            reset.setOnAction(e -> {//Reset all buttons to the first state 

                for (int i = 0; i < 4; i  ) {
                    blankButton[i].setStyle(null);
                }
                
        });


        
                gridpane.add(blankButton[0], 0, 0);
                gridpane.add(blankButton[1], 0, 1);
                gridpane.add(blankButton[2], 1, 0);
                gridpane.add(blankButton[3], 1, 1);

                        
        

        


           for(int i = 0; i < 4; i  ) {//finding which buttons get clicked
                final int buttonInd = i;

                blankButton[i].setOnAction(e -> {
                    onlyTwoSelection  ;
                    if((onlyTwoSelection<=2amp;amp;onlyTwoSelection>0)) {
                        buttonId.add(buttonInd);
                        blankButton[buttonInd].setStyle("-fx-BackGround-color: #ff0000");
                        if(onlyTwoSelection==2) 
                        {
                            blankButton[buttonId.get(0)].setStyle(null);
                            blankButton[buttonId.get(1)].setStyle(null);

                            onlyTwoSelection=0;
                            buttonId.clear();
                        }

                    }





                });
            }   


        hbox.getChildren().addAll(reset);
        hbox.setAlignment(Pos.CENTER);
        gridpane.setAlignment(Pos.CENTER);
        borderPane.setCenter(gridpane);
        borderPane.setBottom(hbox);     
        Scene scene = new Scene(borderPane, 1000, 700);
        primaryStage.setScene(scene);
        primaryStage.setTitle("ColorGame"); 
        primaryStage.show();

    }




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

 

buttonId Сохранение последних 2 кнопок.
onlyTwoSelection это убедиться, что пользователь выбрал два.
reset сбросьте кнопки 4X4.
buttonInd последняя нажатая
кнопка последняя for кнопка предназначена для определения того, на какую кнопку нажал пользователь.

…………..

Редактировать: я думаю, проблема в том, что этот код активируется до того, как пользователь сможет увидеть красный цвет, есть ли какой-нибудь способ остановить или отложить его активацию на секунду?

                         if(onlyTwoSelection==2) 
                        {
                            blankButton[buttonId.get(0)].setStyle(null);
                            blankButton[buttonId.get(1)].setStyle(null);

                            onlyTwoSelection=0;
                            buttonId.clear();
                        }

 

Комментарии:

1. соглашения об именовании Java, пожалуйста

2. Я думаю, что я это исправлю

3. на самом деле нет, вы этого не сделали 😉 .. пожалуйста, проведите некоторое исследование, чтобы изучить соглашения об именовании java — вики-java tag есть ссылка afair. Если нет, просто введите термин в свое любимое поле поиска 🙂 Проблема здесь: имена полей должны начинаться со строчной буквы

4. Спасибо, по крайней мере, я узнаю что-то новое 🙂

5. хорошо 🙂 …….

Ответ №1:

 for (int i = 0; i < 4; i  ) {//finding which buttons get clicked
            final int buttonInd = i;
            blankButton[i].setOnAction(e -> {

                if (onlyTwoSelection < 2) {
                    blankButton[buttonInd].setStyle("-fx-BackGround-color: #ff0000");
                    onlyTwoSelection  ;
                } else {
                    onlyTwoSelection = 0;
                    reset.fire();
                    blankButton[buttonInd].setStyle("-fx-BackGround-color: #ff0000");
                    onlyTwoSelection  ;
                }
            });
        }
 

Вот логика.

Комментарии:

1. да, это сработало, но я должен нажать на третий бутон, и я обнаружил, что последнее if утверждение является корнем проблемы, поэтому, если я смогу отложить его на секунду, прежде чем он будет активирован, мой код должен работать так, как задумано

2. @Mrkhaled, если это решило вашу проблему, выберите ее как правильный ответ. Если после решения этой проблемы у вас возникла новая проблема, найдите время, чтобы попытаться разобраться в ней самостоятельно. Если у вас по-прежнему возникают проблемы после того, как вы потратили некоторое время, чтобы разобраться, вернитесь и задайте новый вопрос. Движущиеся вопросы несправедливы по отношению к человеку, который ответил на ваш первоначальный вопрос.