[JavaFX]在图标化阶段之前无法更改矩形颜色

时间:2016-05-02 15:17:15

标签: java javafx fxml

我有这个FXML文件:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.shape.Rectangle?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="900.0" style="-fx-background-color: #b8edff;" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="labelme.gui.skeleton.SkeletonPageController">
   <children>
       <Rectangle fx:id="minButton" fill="DODGERBLUE" height="50.0" onMouseClicked="#minimizeWindow" onMouseEntered="#changeColorEntered" onMouseExited="#changeColorExited" stroke="BLACK" strokeType="INSIDE" strokeWidth="0.0" width="900.0" />
   </children>
</AnchorPane>

还有这堂课:

public class SkeletonPageController implements Initializable {

@FXML
private Rectangle minButton;

@FXML
private void changeColorEntered(MouseEvent event) {
    this.minButton.setStyle("-fx-fill: red;");
}

@FXML
private void changeColorExited(MouseEvent event) {
    this.minButton.setStyle("-fx-fill: blue;");
}

@FXML
private void minimizeWindow(MouseEvent event){
    Stage window = (Stage)((Rectangle)event.getSource()).getScene().getWindow();
    this.minButton.setStyle("-fx-fill: blue;");
    window.setIconified(true);        
}

@Override
public void initialize(URL url, ResourceBundle rb) {
}   
}

我正在尝试在MouseEntered / MouseExited事件发生时创建一个变为红/蓝的矩形。当我点击它时,舞台应该最小化。

问题是当鼠标点击事件发生时,舞台会被图标化,但矩形不会改变其颜色。 (当舞台返回最大化时,矩形为红色,而不是蓝色)。

解释是什么?不知何故,在改变矩形颜色之前,舞台是图标化的?一旦舞台最小化,颜色就不能再改变了吗?

2 个答案:

答案 0 :(得分:1)

这是一个错误。您可以通过向您打印当前样式的style的{​​{1}}属性注册一个监听器来轻松确认。

这似乎是由于UI在最小化窗口之前没有足够的时间重绘自身,但在窗口恢复时认为自己是最新的。

在最小化之前给窗口足够的时间重绘自己并解决问题。

按预期工作的代码,因为它确保在图标化窗口之前出现另一个框架:

Button

答案 1 :(得分:0)

它不起作用。更好地添加新方法并在MousePressed上设置其操作以更改颜色,然后在MouseReleased操作上标记您的窗口。我试过这个并且有效。

@FXML
private void changeColorMousePressed(MouseEvent event)
{
    this.minButton.setFill(Color.BLUE);// OR this.minButton.setStyle("-fx-fill: blue;");
}


@FXML
private void minimizeWindowMouseReleased(MouseEvent event)
{
    Stage window = (Stage) ((Rectangle) event.getSource()).getScene().getWindow();
    window.setIconified(true);
}