2 つの異なるファイルに次のコードがあります。
@FXML
public void openFileMenu() throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("FileMenu.fxml"), resourceBundle);
AnchorPane root = (AnchorPane) loader.load();
MenuController menuController = loader.getController();
if (toolbarStack.getWidth() < menuController.getContentWidth()) {
menuController.addManipulator();
}
ResizeListener.widthProperty.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
if (toolbarStack.getWidth() < menuController.getContentWidth()) {
menuController.addManipulator();
} else {
menuController.removeManipulator();
}
}
});
}
と
package UI;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.animation.*;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.util.Duration;
public class MenuController implements Initializable {
@Override
public void initialize(URL url, ResourceBundle rb) {}
public void addManipulator() {
AnchorPane.setLeftAnchor(menuScrollPane, 50.0);
AnchorPane.setRightAnchor(menuScrollPane, 50.0);
leftButton = new Button("<");
leftButton.setId("leftButton");
leftButton.setPrefSize(50.0, 100.0);
AnchorPane.setLeftAnchor(leftButton, 0.0);
leftButton.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
slideTo(LEFT);
}
});
leftButton.setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
stopSlide();
}
});
rightButton = new Button(">");
rightButton.setId("rightButton");
rightButton.setPrefSize(50.0, 100.0);
AnchorPane.setRightAnchor(rightButton, 0.0);
rightButton.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
slideTo(RIGHT);
}
});
rightButton.setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
stopSlide();
}
});
mainMenuPane.getChildren().addAll(leftButton, rightButton);
}
public void removeManipulator() {
mainMenuPane.getChildren().removeAll(leftButton, rightButton);
AnchorPane.setLeftAnchor(menuScrollPane, 0.0);
AnchorPane.setRightAnchor(menuScrollPane, 0.0);
}
private void slideTo(boolean direction) {
value.setValue(menuScrollPane.getHvalue());
double realSpeed = direction ? animationSpeed*(1-menuScrollPane.getHvalue()) : animationSpeed*menuScrollPane.getHvalue();
timeline = new Timeline();
KeyValue kv = direction ? new KeyValue(value, 1.0) : new KeyValue(value, 0.0);
KeyFrame frame = new KeyFrame(Duration.millis(realSpeed), kv);
timeline.getKeyFrames().add(frame);
timeline.play();
value.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observableValue, Number oldValue, Number newValue) {
menuScrollPane.setHvalue(newValue.doubleValue());
}
});
}
private void stopSlide() {
timeline.stop();
timeline.getKeyFrames().removeAll(timeline.getKeyFrames());
}
public double getContentWidth() {
return menuContentPane.prefWidthProperty().doubleValue();
}
@FXML
private AnchorPane mainMenuPane;
@FXML
private AnchorPane menuContentPane;
@FXML
private ScrollPane menuScrollPane;
private Button leftButton;
private Button rightButton;
private Timeline timeline;
private DoubleProperty value = new SimpleDoubleProperty();
private final boolean LEFT = true;
private final boolean RIGHT = false;
private double animationSpeed = 1000.0;
}
問題は、ボタンを追加した後、menuController.addManipulator();
それらを削除することは不可能であり、menuController.removeManipulator();
機能しないことです。しかし、最も奇妙なことは、mainMenuPane.getChildren().removeAll(leftButton, rightButton);
機能しないだけでなくAnchorPane.setLeftAnchor(menuScrollPane, 0.0); AnchorPane.setRightAnchor(menuScrollPane, 0.0);
、必要なことをすべて実行することです。なにが問題ですか?