0

その中に aと 2JFXDrawerSalesDrawer含む aを使用しています。の内容には、別のコントローラーがあります。のボタンをクリックすると表示されるように設定したい 2 つのアンカー ペインで構成される を含むコントローラ ファイル。これまで、一連の静的ブール変数を使用していましたが、JFXDrawer のボタンをクリックすると、変数の 1 つが true に設定されていることを確認していました。次に 、オブジェクトを使用してこれらの変数のどれが true かを確認し、必要なアンカー ペインを表示に設定しました。これを行うより良い方法はありますか?VBoxJFXButtonsJFXDrawerSalesDrawerController.javaSalesController.javaJFXDrawerJFXDrawerSalesController.javaTimerTask

SalesDrawerController.java

public class SalesDrawerController implements Initializable {
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    
    @FXML
    private void button1Hit(MouseEvent event) {
        SalesController.SD[0]=true;  
    }
    @FXML
    private void button2Hit(MouseEvent event) {
        SalesController.SD[1]=true;
    }  
}

SalesController.java

 public class SalesController implements Initializable {

        public static boolean SD[]= {false,false};
        static boolean tock=true;
         @FXML
        private AnchorPane eq_newpane;
        @FXML
        private AnchorPane eq_delpane;
        @FXML
        private JFXHamburger SalesHam;
        @FXML
        private JFXDrawer SalesDraw;
         public void initialize(URL url, ResourceBundle rb) {
            eq_newpane.setVisible(true);
            eq_delpane.setVisible(false); 
            eq_newpane.setDisable(false);
            eq_delpane.setDisable(true); 
            VBox box = FXMLLoader.load(getClass().getResource("/fxml/SalesDrawer.fxml"));

        SalesDraw.setSidePane(box);
           HamburgerBackArrowBasicTransition transition = new HamburgerBackArrowBasicTransition(SalesHam);
           transition.setRate(-1);

            SalesHam.addEventHandler(MouseEvent.MOUSE_PRESSED,(e)->{
            transition.setRate(transition.getRate()*-1);
            transition.play();
            if(SalesDraw.isShown()){
          SalesDraw.close(); 
          SalesDraw.toBack();
            }
            else{
                SalesDraw.toFront();
                SalesDraw.open();
            } 
            });
            threadtock();

    }
    public void threadtock() {
      final java.util.Timer timer = new java.util.Timer();
          final TimerTask delayedThreadStartTask;
            delayedThreadStartTask = new TimerTask() {
                public void run() {
                    try
                    {
                        if(tock){
                            if(SD[0])
                            {
                               eq_newpane.setVisible(true);
                               eq_delpane.setVisible(false); 
                               eq_newpane.setDisable(false);
                               eq_delpane.setDisable(true); 

                            }
                            else if(SD[1]){
                                eq_delpane.setVisible(true);
                                eq_newpane.setVisible(false);
                                eq_newpane.setDisable(true);
                                eq_delpane.setDisable(false); 
                            }

                            if(tock)
                            {
                                threadtock();
                            }

                        }
                    }
                        catch(Exception e)
                                {
                                 e.printStackTrace();
                                }

                    }

                };

                timer.schedule(delayedThreadStartTask, 500);
            };
}
4

1 に答える 1

0

同期メカニズムを使用して、一度に同じ変数を操作しようとする 2 つ以上のスレッドからコード内のデッドロックを継承しないようにします。

スレッドを適切に同期する方法を理解するのは骨の折れる作業であり、デバッグどころか説明するのも非常に困難です。したがって、私の最善のアドバイスは、「Java Concurrency」と「Java Thread Synchronization」に Google を使用することです。

それ以外の場合は、メイン アプリケーションからスレッドを開始して、意図した操作を実行する必要があります。

于 2018-03-05T21:27:13.183 に答える