用于控制JFXDrawer中组件的线程

时间:2018-03-05 20:38:28

标签: java javafx jfoenix

我正在使用JFXDrawerSalesDrawer,其中包含VBox和2 JFXButtonsJFXDrawer的内容有一个单独的控制器SalesDrawerController.java。包含SalesController.java的控制器文件JFXDrawer包含2个锚点窗格,我想在点击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;
    }  
}

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

1 个答案:

答案 0 :(得分:0)

使用同步机制,这样就不会从两个或多个尝试同时对同一个变量进行操作的线程继承代码中的死锁。

弄清楚如何正确同步你的线程可能很痛苦,而且很难解释,更不用说调试了。所以,我最好的建议是使用google for" Java Concurrency"和#34; Java线程同步"。

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