Я делаю проект javafx, который, если я нажму кнопку, покажет сцену, но если сцена останется открытой на несколько секунд, сцена автоматически скроется.
Фактическая сцена такова, что если я оставлю ее открытой, она автоматически скроется внизу основной сцены, как только будет нажата кнопка.
Но я пробовал много способов, сцена либо не будет скрываться, либо будет двигаться вверх, и если я нажму кнопку, сцена будет двигаться вверх по сцене, но не на основной сцене.
Если сцена находится не на основной сцене, ничего не произойдет. Но только если сцена находится на основной сцене, сцена автоматически скроется и переместится вниз, так же, как когда я нажимаю кнопку, сцена появляется на основной сцене снизу, и если я нажимаю закрыть, сцена опускается и скрывается, пока я не нажму еще раз. когда я нажимаю кнопку после нескольких неактивных действий (например, перемещаю курсор), сцена будет работать как обычно.
Код, которому я следую: Вызов другого FXML на этапе
Тестированиеgg.java
package testinggg;
import java.io.IOException;
import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.input.InputEvent;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Testinggg extends Application {
private TestController controller;
@Override
public void start(Stage stage) throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Test.fxml"));
Parent root = loader.load();
controller = loader.getController();
stage.setScene(new Scene(root));
stage.setFullScreen(true);
stage.show();
Duration duration = Duration.seconds(5);
PauseTransition transition = new PauseTransition(duration);
transition.setOnFinished(evt -> inactive());
stage.addEventFilter(InputEvent.ANY, evt -> transition.playFromStart());
transition.play();
}
private void inactive(){
//hide the status until status is open
}
public static void main(String[] args) {
launch(args);
}
}
TestController.java
package testinggg;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.animation.TranslateTransition;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.VBox;
import javafx.util.Duration;
public class TestController implements Initializable {
@FXML private VBox statusContainer;
private TranslateTransition showStatus;
private TranslateTransition hideStatus;
boolean showsStatus = false;
public void toggleStatus() {
if ( showsStatus ) {
showStatus.stop();
hideStatus.play();
}
else {
hideStatus.stop();
showStatus.play();
}
}
@Override
public void initialize(URL url, ResourceBundle rb) {
showStatus = new TranslateTransition(Duration.millis(250), statusContainer);
showStatus.setByY(-1080.0);
showStatus.setOnFinished(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
showsStatus = true;
}
});
hideStatus = new TranslateTransition(Duration.millis(250), statusContainer);
hideStatus.setByY(1080.0);
hideStatus.setOnFinished(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
showsStatus = false;
}
});
}
}
для Test.fxml
<?xml version = "1.0" encoding = "UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.web.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.image.*?>
<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<StackPane maxHeight = "-Infinity" maxWidth = "-Infinity" minHeight = "-Infinity" minWidth = "-Infinity" prefHeight = "1080.0" prefWidth = "1920.0" xmlns = "http://javafx.com/javafx/8" xmlns:fx = "http://javafx.com/fxml/1" fx:controller = "testinggg.TestController">
<children>
<AnchorPane id = "AnchorPane" maxHeight = "-Infinity" prefHeight = "1080.0" prefWidth = "1920.0" StackPane.alignment = "TOP_LEFT">
<children>
<Button mnemonicParsing = "false" onAction = "#toggleStatus" prefHeight = "1080.0" prefWidth = "1920.0" text = "Button" />
</children>
</AnchorPane>
<VBox fx:id = "statusContainer" maxHeight = "1080.0" prefHeight = "1080.0" translateY = "1080.0" StackPane.alignment = "BOTTOM_LEFT">
<children>
<AnchorPane prefHeight = "668.0" prefWidth = "1266.0">
<VBox.margin>
<Insets bottom = "50.0" left = "50.0" right = "50.0" top = "50.0" />
</VBox.margin>
<children>
<ImageView fitHeight = "540.0" fitWidth = "1820.0" layoutY = "43.0" pickOnBounds = "true">
<image>
<Image url = "@../Rainbow%20Poro.png" />
</image>
</ImageView>
<ImageView fitHeight = "44.0" fitWidth = "153.0" layoutX = "857.0" pickOnBounds = "true" preserveRatio = "true">
<image>
<Image url = "@../logo.png" />
</image>
</ImageView>
<ScrollPane layoutY = "582.0" prefHeight = "391.0" prefViewportHeight = "208.0" prefViewportWidth = "1266.0" prefWidth = "1820.0">
<content>
<TextArea editable = "false" layoutY = "460.0" prefHeight = "515.0" prefWidth = "1804.0" text = "Some paragraph here" />
</content>
</ScrollPane>
<Button layoutX = "1775.0" mnemonicParsing = "false" onAction = "#toggleStatus" text = "Close" />
</children>
</AnchorPane>
</children>
</VBox>
</children>
<stylesheets>
<URL value = "@test1.css" />
</stylesheets>
</StackPane>
Закончив редактирование. Спасибо за помощь.
Нетихий. Это должно быть копирование-вставка, поэтому вам нужны целые классы, включая импорт и fxml. Я все еще не уверен, чего вы пытаетесь достичь. Вы просто пытаетесь вызвать `controller.toggleStatus();` через 5 секунд? «Автоматическое скрытие сцены через несколько секунд, когда сцена остается открытой» можно добиться, вызвав stage.hide()
через 5 секунд.
Я пытаюсь внести ясность. Я хочу проверить, является ли вторая сцена, в которой VBox находится на основной сцене, которая является AnchorPane с кнопкой. Если да, я хочу, чтобы он автоматически закрывал (прятал) вторую сцену и отображал основную сцену через 5 секунд. Если нет, то ничего не делать. контроллер.toggleStatus(); Я старался. но когда он неактивен на основной сцене, он автоматически открывает вторую сцену.
Возможно, вы используете неправильные термины. Я не вижу двух сцен в вашем коде. Я вижу одну сцену, корневой узел StackPane
с двумя дочерними узлами: AnchorPane
и Vbox
.
Вот версия кода Макви, которой вы следуете, для начала:
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Test1 extends Application {
@Override
public void start(Stage primaryStage) {
try {
StackPane page = (StackPane) FXMLLoader.load(this.getClass().getResource("test1.fxml"));
Scene scene = new Scene(page);
primaryStage.setScene(scene);
primaryStage.show();
}
catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
test1.fxml
<?xml version = "1.0" encoding = "UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<StackPane id = "StackPane" maxHeight = "-Infinity" maxWidth = "-Infinity" minHeight = "-Infinity"
minWidth = "-Infinity" prefHeight = "300.0" prefWidth = "500.0" xmlns = "http://javafx.com/javafx/10.0.1"
xmlns:fx = "http://javafx.com/fxml/1" fx:controller = "Test1Controller">
<children>
<AnchorPane prefHeight = "200.0" prefWidth = "200.0" style = "-fx-background-color: blue;">
<children>
<Button mnemonicParsing = "false" onAction = "#toggleStatus" text = "Status" AnchorPane.leftAnchor = "50.0" AnchorPane.topAnchor = "100.0" />
</children>
</AnchorPane>
<VBox fx:id = "statusContainer" maxHeight = "100.0" prefHeight = "100.0" style = "-fx-background-color: yellow;" translateY = "100.0" StackPane.alignment = "BOTTOM_LEFT" />
</children>
</StackPane>
и его контроллер:
import javafx.animation.TranslateTransition;
import javafx.fxml.FXML;
import javafx.scene.layout.VBox;
import javafx.util.Duration;
public class Test1Controller {
@FXML private VBox statusContainer;
private TranslateTransition showStatus;
private TranslateTransition hideStatus;
private boolean showsStatus = false;
@FXML void initialize() {
showStatus = new TranslateTransition(Duration.millis(250), statusContainer);
showStatus.setByY(-100.0);
showStatus.setOnFinished(event -> showsStatus = true);
hideStatus = new TranslateTransition(Duration.millis(250), statusContainer);
hideStatus.setByY(100.0);
hideStatus.setOnFinished(event -> showsStatus = false);
}
public void toggleStatus() {
if ( showsStatus ) {
showStatus.stop();
hideStatus.play();
}
else {
hideStatus.stop();
showStatus.play();
}
}
}
Редактировать: можно добавить автоскрытие скользящего узла в контроллер:
public class Test1Controller {
@FXML private VBox statusContainer;
private TranslateTransition showStatus;
private TranslateTransition hideStatus;
private boolean showsStatus = false;
private static final int AUTO_HIDE_DEALY = 5;
@FXML void initialize() {
showStatus = new TranslateTransition(Duration.millis(250), statusContainer);
showStatus.setByY(-100.0);
showStatus.setOnFinished(event -> {
showsStatus = true;
autoHide();
});
hideStatus = new TranslateTransition(Duration.millis(250), statusContainer);
hideStatus.setByY(100.0);
hideStatus.setOnFinished(event -> showsStatus = false);
}
public void toggleStatus() {
if ( showsStatus ) {
hide();
}
else {
show();
}
}
private void show(){
hideStatus.stop();
showStatus.play();
}
private void hide(){
showStatus.stop();
hideStatus.play();
}
private void autoHide() {
Duration duration = Duration.seconds(AUTO_HIDE_DEALY);
PauseTransition transition = new PauseTransition(duration);
transition.setOnFinished(evt ->{
if ( showsStatus ) {
hide();
}
});
transition.play();
}
}
Но что, если все еще активны такие действия, как движение мыши, щелчок и т. д. Он также автоматически скрывается. Как обнаружить и не скрывать автоматически, когда он активен, но автоматически скрывать, когда он неактивен всего 5 секунд
Попробуйте добавить необходимую функциональность на основе этого ответа. Если вам нужна дополнительная помощь, опубликуйте новый вопрос, покажите, что вы сделали, и точно определите, что должно предотвратить скрытие узла.
Пожалуйста, выложите код, а не ссылку на него. Вы можете оставить отзыв минимальный воспроизводимый пример. Также уточните, что является желаемым результатом и фактическим.