我有这个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事件发生时创建一个变为红/蓝的矩形。当我点击它时,舞台应该最小化。
问题是当鼠标点击事件发生时,舞台会被图标化,但矩形不会改变其颜色。 (当舞台返回最大化时,矩形为红色,而不是蓝色)。
解释是什么?不知何故,在改变矩形颜色之前,舞台是图标化的?一旦舞台最小化,颜色就不能再改变了吗?
答案 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);
}