Есть ли способ отключить / включить элементы в приложении javaFx при запуске указанного приложения, т.е. панели и кнопки - PullRequest
0 голосов
/ 02 апреля 2020

Хорошо, так что это первый вопрос, который я задал в StackOverflow, поэтому извиняюсь, если он неясен.

По сути, я делаю программу на JavaFx , которая является системой заказа для поддельное кафе. Это для задания, и оно действительно не должно иметь общепринятого смысла, потому что моя учебная программа на самом деле не заботится о том, полезна она или нет, они просто хотят видеть, как вы кодируете случайные вещи.

В любом случае, проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь сделать так, чтобы при открытии главной страницы с именем MainPage.f xml 4 вещи были предварительно отключены / включены. Этими элементами являются PinPane, который содержит кнопки входа и метки), PrimaryPane (который содержит все кнопки, ведущие на разные страницы заказа), SettingsBtn (отправляет пользователя в настройки) и LogoutBtn (саморасширяющийся).

This это важно, потому что когда программа открывается впервые, MainPage запускается первым. Как только пользователь входит в систему и уходит на другую страницу, чтобы выбрать элемент, однако, когда он возвращается на главную страницу, где текущий порядок отображается в PrimaryPage (я фактически еще не сделал никакого кода для этого), я хочу убедиться, что отключенные / включенные состояния всех 4 элементов остаются такими же, как когда пользователь оставил go на другой странице.

В настоящее время я использую класс stati c с именем DataContainer. java, который содержит все данные, совместно используемые программой, и я подумал, что могу поместить 3 логические переменные, которые в основном просто сообщают программе о открытие MainPage, что отключено и включено.

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

Мой код для MainPageController. java ниже:

'' '

public class MainPageController {

   @FXML private Label Price; //fx:if -> Price

   @FXML public  Pane PrimaryPage, PinPane; //fx:id -> PrimaryPage

   @FXML public  Label Pin; //fx:id -> Pin

   @FXML public  Button LogoutBtn, SettingsBtn;



   public void Check(ActionEvent event) throws IOException{

  // This is the method I use to check the entered pin against current 
  // saved pins. 

       DataContainer.DataContainer();
       // This is just a method i use for testing, it adds a manager account that i can sign in with 
       // each time the program is opened because I haven't introduced account creation and saving 
       // yet

       int pin = Integer.parseInt(Pin.getText());

       int i = DataContainer.Users.size();
       int x = 0;
       while (x <= i-1){
           if (DataContainer.Users.get(x).PinNumber == pin){

           // In this, once the pin is verified, each element is enabled and disabled, and the 
           // boolean variables are set as well for future use

                System.out.println("test");
                DataContainer.UserIndex = x;
                PrimaryPage.setDisable(false);
                LogoutBtn.setDisable(false);
                DataContainer.PrimaryPage = true;
                Pin.setText("");
                PinPane.setDisable(true);
                DataContainer.PinPane = false;
                break;

           }
           x = x + 1;
       }

       if (DataContainer.Users.get(DataContainer.UserIndex).Position.equals("Manager")){

           SettingsBtn.setDisable(false);
           DataContainer.SettingsBtn = true;

        }

' ''

Это код для DataContainer. java

'' '

public class DataContainer{

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

    public static void DataContainer(){
        Users.add(owner); 
        System.out.println("test");
    }

    static boolean PinPane = true, PrimaryPage  = false, SettingsBtn = false; 
    // These boolean values are relevant to the MainPage application
    // Their purpose is to retain the information of the state in which the user
    // left the main page, i.e, if the PinPage is disabled, the PrimaryPage is enabled, etc.
    // this is important as if these variables don't exist the MainPage and its elements
    // go back to their default state and the user has to re-sign in.

    static String firstname, lastname, position;
    static int PinNo, PhoneNo, UserIndex;

    public static UserVariables user = new UserVariables(firstname, lastname, position, PinNo, 
    PhoneNo);

    static UserVariables owner = new UserVariables("Test", "User", "Manager", 1234, 
    0434553);


    public static ArrayList<UserVariables> Users = new ArrayList<UserVariables>();

    }

' ''

И, наконец, это код для FInalIA. java (Основной класс):

'' '

public class FInalIA extends Application implements Serializable {

     public static void main(String args[]) {

     launch(args);

     }


     @Override
     public void start(Stage stage) throws Exception {
        // StackPane root = new StackPane();
        Parent root = (Parent) FXMLLoader.load(getClass().getResource("MainPage.fxml"));
        Scene scene = new Scene(root);

        stage.setTitle("Main Page");
        stage.setScene(scene);
        stage.setResizable(false);

        stage.show();

        MainPageController.Open();

    }

  }

' ''

И, наконец, это код, который я собирался использовать, делая публикацию c stati c метод с именем 'Open ()', и все панели становятся равными c, и просто вызывается этот метод, когда открыта MainPage.

''

public static void Open(){
    if (DataContainer.PinPane == false){
        PinPane.setDisable(true);
    }

    else{
        PinPane.setDisable(false);
    }

    if(DataContainer.PrimaryPage == false){
        PrimaryPage.setDisable(true);
        LogoutBtn.setDisable(true);
    }

    else{
        PrimaryPage.setDisable(false);
        LogoutBtn.setDisable(false);
    }

    if(DataContainer.SettingsBtn == false){
        SettingsBtn.setDisable(true);
    }

    else{
        SettingsBtn.setDisable(false);
    }

}

'' '

Спасибо всем, кто помогает мне с этим (также вы, ребята, скажите, пожалуйста, скажите, если то, что я пишу, не является кратким и неуместным или действительно ли это хорошо)

1 Ответ

0 голосов
/ 02 апреля 2020

Шаг первый, сделай Open non-stati c. Вы собираетесь создать экземпляр вашего контроллера, и он будет управлять связанными элементами.

public class MainPageController implements Initializable{
   @FXML private Label price; //fx:if -> Price
   @FXML public  pane primaryPage, pinPane; //fx:id -> PrimaryPage
   @FXML public  Label pin; //fx:id -> Pin
   @FXML public  button bogoutBtn, settingsBtn;

   public void Check(ActionEvent event) throws IOException{
       //why is this method included but not open?
   }
   @Override
   public void initialize(URL url, ResourceBundle rb){
       if (DataContainer.PinPane == false){
           pinPane.setDisable(true);
       } else{
           pinPane.setDisable(false);
       }
       primaryPage.setDisable( ! DataContainer.PrimaryPage );
       logoutBtn.setDisable(! DataContainer.PrimaryPage);
       //etc etc      
    }
}

Я заставил ваш контроллер реализовать Initializable, таким образом у него есть метод initialize, который вызывается при запуске , Я также улучшил наименование, например, Pin должно называться pin. Если это не работает для вас, я могу заменить это небольшим приложенным примером.

Вам не нужно реализовывать Initializable javafx автоматически вызовет соответствующий метод инициализации.

...