我正在使用JFXDrawer
,SalesDrawer
,其中包含VBox
和2 JFXButtons
。 JFXDrawer
的内容有一个单独的控制器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);
};
}
答案 0 :(得分:0)
使用同步机制,这样就不会从两个或多个尝试同时对同一个变量进行操作的线程继承代码中的死锁。
弄清楚如何正确同步你的线程可能很痛苦,而且很难解释,更不用说调试了。所以,我最好的建议是使用google for" Java Concurrency"和#34; Java线程同步"。
否则,您应该从主应用程序启动线程/线程以执行预期的操作