0

我正在使用 a JFXDrawerSalesDrawer其中包含 aVBox和 2 JFXButtons。的内容JFXDrawer有一个单独的控制器,SalesDrawerController.java. 控制器文件SalesController.java 包含JFXDrawer2 个锚窗格,我希望在单击JFXDrawer. 到目前为止,我一直在使用一组静态布尔变量,并确保单击 JFXDrawer 中的一个按钮,其中一个变量设置为 true。然后在 中 SalesController.java,我使用一个TimerTask对象来检查这些变量中的哪些是真实的,并将所需的锚窗格设置为可见。有没有更好的方法来做到这一点?

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;
    }  
}

销售控制器.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 个或更多线程尝试同时操作同一变量时继承代码中的死锁。

弄清楚如何正确同步线程可能会很痛苦,而且很难解释,更不用说调试了。所以,我最好的建议是使用 google 来获取“Java Concurrency”和“Java Thread Synchronization”。

否则,您应该从主应用程序启动一个/多个线程来执行您的预期操作

于 2018-03-05T21:27:13.183 回答