Интерактивные ячейки gridpane javafx, которые переключаются и отключаются

Я пытаюсь создать сетку, которая переключается / отключается, когда пользователь нажимает на определенные ячейки. Например, когда пользователь нажимает на ячейку с содержимым «*», я хочу, чтобы содержимое этой конкретной ячейки было изменено на пустую ячейку «». Точно так же, если пользователь щелкает ячейку с пустым содержимым «», я хочу, чтобы содержимое этой ячейки было изменено на ячейку с содержимым «*».

По сути, я начинаю с сетки, которая частично вводится следующим образом:

Интерактивные ячейки gridpane javafx, которые переключаются и отключаются

Моя сетка изначально вводится следующим образом: я отслеживаю матрицу логических значений, которая показывает, должен ли быть «*» в одной ячейке матрицы. Если в ячейке [i, j] области сетки есть «*», то значение матрицы [i, j] должно быть true, иначе должно быть false.

  boolean matrix[][] = new boolean[StateList.size()+1][RequirementList.size()+1];

    for( InstanceArtifact li: ListOfLinks) {
        int y=1; 
        for(InstanceArtifact re: RequirementList) {
            int x=1; 
            for(InstanceArtifact state: StateList) {
             if (li.getPropertyValue("linksource").equals(re) && li.getPropertyValue("linktarget").equals(state)) {

                     link= new Label("    *    "); 
                    //tick in cell (1,1)
                    grid.add(link, y, x); 
                    matrix[x][y]= true; 

                }
             else {
                   link= new Label("         "); 
                    //tick in cell (1,1)
                    grid.add(link, y, x); 

             }
             x++; 


        }
        y++; 
    }


    }




    }

Что я хотел бы сделать, так это переключить / отключить звезды, это то, что я пытаюсь сделать с помощью приведенного ниже кода, поскольку мы нажимаем на ячейку, содержащую "*", что означает, что matrix[i][j]=true, я удаляю соответствующую метку в grid, и я добавляю новую метку с пустым текстом. Я также делаю то же самое в противоположной ситуации, когда текст метки пуст, и мне нужно заменить его меткой, содержащей звездочку.

         grid.getChildren().forEach(element -> {
                         element.setOnMouseClicked(new EventHandler<MouseEvent>() {

                    @Override
                    public void handle(MouseEvent event) {
                        int matrixX= GridPane.getRowIndex(element); 
                        int matrixY= GridPane.getColumnIndex(element); 
                        if (element!=null  && matrixX!=0 && matrixY!=0) {

                             System.out.println("matrixX: "+matrixX+"   matrixY: "+matrixY);
                             System.out.println("matrixY: "+matrixY+" "+ matrix[matrixX][matrixY]);
                            if (matrix[matrixX][matrixY]==true && matrixX!=0 && matrixY!=0) {

                                   System.out.println("HEY I AM HERE FIRSTTTTTTTTT");

                                  Node newnode= new Label("     ");
                                  GridPane.clearConstraints(element); 
                                 // grid.getChildren().remove(element); 

                                grid.add(newnode, matrixY, matrixX); 
                                matrix[matrixX][matrixY]=false; 
                                /*for(int l=0; l<RequirementList.size(); l++) {
                                    for(int p=0; p<StateList.size(); p++) {
                                        System.out.println(l + "  "+p +" "+matrix[l][p]);
                                    }
                                }*/


                                //grid.add(mynode, matrixY+1, matrixX+1, 1, 1); 


                            }
                            else if (matrix[matrixX][matrixY]==false && matrixX!=0 && matrixY!=0){

                                 System.out.println("HEY I AM HERE SECONDDDDDDD   ");

                                /* for(int l=0; l<RequirementList.size(); l++) {
                                        for(int p=0; p<StateList.size(); p++) {
                                            System.out.println(l + "  "+p +" "+matrix[l][p]);
                                        }
                                    }*/

                                    Node falsenode= new Label("   *      ");
                                    GridPane.clearConstraints(element); 
                                     // grid.getChildren().remove(element); 

                                    grid.add(falsenode, matrixY, matrixX); 
                                    matrix[matrixX][matrixY]=true; 


                            }


                         //   System.out.println("Row: " + GridPane.getRowIndex(element));
                           // System.out.println("Column: " + GridPane.getColumnIndex(element));
                        }   
                        }

                });
                     });

Мой код работает не так, как ожидалось, я бы хотел, чтобы ячейка переключалась / отключалась всякий раз, когда пользователь нажимает на ячейку, код выполняется только в первый раз, когда пользователь нажимает на данную ячейку, если пользователь нажимает на ту же ячейку несколько раз (более одного раза), то ничего не происходит.

Кроме того, строка кода, в которой я пытаюсь удалить метку, не работает:

       grid.getChildren().remove(element); 

Почему бы не использовать ToggleButton в каждой ячейке?

Sedrick 15.04.2018 19:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это могло бы быть лучше выполнено с ToggleButton. Комментарии в коде.

import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

/**
 *
 * @author Sedrick
 */
public class JavaFXApplication60 extends Application {   

    @Override
    public void start(Stage primaryStage) {     
        //Start create GUI
        Label lblRequirement11 = new Label("Requirement1");
        Label lblRequirement12 = new Label("Requirement2");
        Label lblRequirement13 = new Label("Requirement3");
        GridPane.setConstraints(lblRequirement11, 1, 0);
        GridPane.setConstraints(lblRequirement12, 2, 0);
        GridPane.setConstraints(lblRequirement13, 3, 0);

        Label lblState1 = new Label("State1");
        ToggleButton toggleButton11 = new ToggleButton();
        toggleButton11.setMaxWidth(Double.MAX_VALUE);
        ToggleButton toggleButton12 = new ToggleButton();
        toggleButton12.setMaxWidth(Double.MAX_VALUE);
        ToggleButton toggleButton13 = new ToggleButton();
        toggleButton13.setMaxWidth(Double.MAX_VALUE);
        GridPane.setConstraints(lblState1, 0, 1);
        GridPane.setConstraints(toggleButton11, 1, 1);
        GridPane.setConstraints(toggleButton12, 2, 1);
        GridPane.setConstraints(toggleButton13, 3, 1);

        Label lblState2 = new Label("State2");
        ToggleButton toggleButton21 = new ToggleButton();
        toggleButton21.setMaxWidth(Double.MAX_VALUE);
        ToggleButton toggleButton22 = new ToggleButton();
        toggleButton22.setMaxWidth(Double.MAX_VALUE);
        ToggleButton toggleButton23 = new ToggleButton();
        toggleButton23.setMaxWidth(Double.MAX_VALUE);
        GridPane.setConstraints(lblState2, 0, 2);
        GridPane.setConstraints(toggleButton21, 1, 2);
        GridPane.setConstraints(toggleButton22, 2, 2);
        GridPane.setConstraints(toggleButton23, 3, 2);

        Label lblState3 = new Label("State3");
        ToggleButton toggleButton31 = new ToggleButton();
        toggleButton31.setMaxWidth(Double.MAX_VALUE);
        ToggleButton toggleButton32 = new ToggleButton();
        toggleButton32.setMaxWidth(Double.MAX_VALUE);
        ToggleButton toggleButton33 = new ToggleButton();
        toggleButton33.setMaxWidth(Double.MAX_VALUE);
        GridPane.setConstraints(lblState3, 0, 3);
        GridPane.setConstraints(toggleButton31, 1, 3);
        GridPane.setConstraints(toggleButton32, 2, 3);
        GridPane.setConstraints(toggleButton33, 3, 3);

        GridPane root = new GridPane(); 
        root.setVgap(5);
        root.setHgap(5);
        root.getChildren().addAll(lblRequirement11, lblRequirement12, lblRequirement13);
        root.getChildren().addAll(lblState1, toggleButton11, toggleButton12, toggleButton13);
        root.getChildren().addAll(lblState2, toggleButton21, toggleButton22, toggleButton23);
        root.getChildren().addAll(lblState3, toggleButton31, toggleButton32, toggleButton33);
        //End create GUI

        //Start create ToggleButtons' event handlers.
        List<ToggleButton> toggleButtonList = new ArrayList();
        toggleButtonList.add(toggleButton11);
        toggleButtonList.add(toggleButton12);
        toggleButtonList.add(toggleButton13);
        toggleButtonList.add(toggleButton21);
        toggleButtonList.add(toggleButton22);
        toggleButtonList.add(toggleButton23);
        toggleButtonList.add(toggleButton31);
        toggleButtonList.add(toggleButton32);
        toggleButtonList.add(toggleButton33);

        for(ToggleButton tempToggleButton : toggleButtonList)
        {
            tempToggleButton.setOnAction(actionEvent -> {
                if (tempToggleButton.isSelected())
                {
                    tempToggleButton.setText("*");
                }
                else
                {
                    tempToggleButton.setText("");
                }
            });
        }
        ////End create ToggleButtons' event handlers.



        Scene scene = new Scene(root, 400, 300);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

Другие вопросы по теме