Java переключение между окнами

Переключение между окнами по кнопке JAVAFX

В наши дни, программирование стало одним из самых популярных и востребованных специализаций в сфере IT. Умение создавать программы – это навык, который позволяет создавать новые возможности и упрощать жизнь человечеству. Большую роль в этом играют различные фреймворки и библиотеки, среди которых можно выделить JavaFX, позволяющий создавать мощные и красивые пользовательские интерфейсы для Java-приложений на десктопе и мобильных устройствах.

Переключение между окнами – это одна из наиболее важных задач в разработке приложений. И как раз для этого в JavaFX есть множество инструментов, помогающих решать эту проблему. В данной статье мы рассмотрим один из таких инструментов – кнопку переключения между окнами.

В JavaFX кнопка является одним из самых базовых элементов интерфейса пользователя. Она может использоваться для выполнения различных действий, например, вызов другого окна или выполнение некоторой операции. Кроме того, кнопка может быть оформлена в различных стилях и иметь множество дополнительных параметров и свойств.

Для начала создадим два окна, между которыми мы будем переключаться. Для этого воспользуемся классом Stage, который представляет из себя окно приложения. Создадим два объекта этого класса и заполним их некоторой информацией:

Stage firstStage = new Stage(); firstStage.setTitle("Первое окно"); Stage secondStage = new Stage(); secondStage.setTitle("Второе окно");

Теперь нам необходимо добавить на эти окна кнопки, которые будут выполнять функцию переключения между ними. Для этого воспользуемся классом Button:

Button firstButton = new Button("Второе окно"); firstButton.setOnAction(event -> < secondStage.show(); firstStage.close(); >); Button secondButton = new Button("Первое окно"); secondButton.setOnAction(event -> < firstStage.show(); secondStage.close(); >);

Как видно из кода выше, мы создали две кнопки: первая – для перехода на второе окно, вторая – для перехода на первое окно. При нажатии на первую кнопку происходит закрытие первого окна и открытие второго, при нажатии на вторую кнопку – наоборот.

Читайте также:  Открыть файл firefox html

Но что, если мы захотим вернуться на предыдущее окно, как это сделать? В этом случае необходимо знать, как сохранять состояние окна. Для этого воспользуемся классом Scene:

Scene firstScene = new Scene(new BorderPane(new Label("Первое окно")), 300, 200); firstStage.setScene(firstScene); Scene secondScene = new Scene(new BorderPane(new Label("Второе окно")), 300, 200); secondStage.setScene(secondScene);

В данном коде мы создали объекты класса Scene, которые являются контейнерами для элементов интерфейса и хранят их состояние. Затем мы добавили эти сцены в объекты класса Stage, чтобы они стали частью этих окон.

Теперь, чтобы переключиться обратно, нам нужно сохранить текущую сцену и при нажатии на кнопку вернуться к предыдущей:

Scene currentScene = firstScene; firstButton.setOnAction(event -> < secondStage.show(); currentScene = firstScene; firstStage.close(); >); secondButton.setOnAction(event -> < firstStage.show(); currentScene = secondScene; secondStage.close(); >); Button backButton = new Button("Назад"); backButton.setOnAction(event -> < if (currentScene == firstScene) < firstStage.show(); secondStage.close(); >else < secondStage.show(); firstStage.close(); >>);

Как видно из кода выше, мы создали еще одну кнопку – «Назад», которая будет возвращать нас на предыдущую сцену. Для этого мы сохраняем текущую сцену в переменную currentScene и, в зависимости от ее значения, выводим нужное окно.

Таким образом, мы рассмотрели, как можно реализовать переключение между окнами по кнопке в JavaFX. Данный метод является одним из самых простых и удобных в использовании, что делает его очень популярным среди разработчиков. Надеюсь, данная статья была полезна и помогла разобраться в данной теме.

Похожие записи:

Источник

How to switch between Scenes in JavaFX

Once you’ve graduated from creating simple GUI’s in JavaFX and are ready to take the next step, creating multiple windows is a topic that will often come up. One way of doing so is to create a new Stage, thus having two windows with different UI elements.

However, there is an alternative. Instead of having multiple windows clutter your screen, just switch the current Scene with another. It’s much simpler than it looks and interesting to learn.

Switching between two Scenes

There isn’t really any new syntax here, just a new concept that’s interesting to learn. Typically we swap between scenes in certain conditions, like maybe a game where a new map is loading, or accessing the “settings” page from a menu etc.

Since we’re focusing more on the layout and contents of the Scene, we’ll bring out the setAlignment() method. This method takes as Parameter a Pos (position) object which determines the position of the widgets in the layout. This method isn’t for the scene though, it’s for our Layout object.

The real magic of this code is the use of the setScene() function. Using this together with the QPushButton widget we can cause our button clicks to change the scene that’s currently being displayed on our stage.

package application; import javafx.application.Application; import javafx.collections.FXCollections; import javafx.geometry.Pos; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.VBox; public class Tutorial extends Application < public static void main(String args[])< launch(args); >@Override public void start(Stage primaryStage) throws Exception < VBox layout = new VBox(); VBox layout2 = new VBox(); layout.setAlignment(Pos.CENTER); layout2.setAlignment(Pos.CENTER); Scene scene = new Scene(layout, 300, 300); Scene scene2 = new Scene(layout2, 300, 300); Label label1 = new Label("This is the First Scene"); Label label2 = new Label("This is the Second Scene"); Button button = new Button("Forward"); button.setOnAction(e ->primaryStage.setScene(scene2)); Button button2 = new Button("Backwards"); button2.setOnAction(e -> primaryStage.setScene(scene)); TextField text = new TextField(); text.setMaxWidth(100); layout.getChildren().addAll(label1, button); layout2.getChildren().addAll(label2, button2, text); primaryStage.setTitle("CodersLegacy"); primaryStage.setScene(scene); primaryStage.show(); > >

It’s necessary for each Scene to have it’s own unique layout. You cannot use the same layout object for both Scenes. Similarly, only add those objects into the layout that you want to see on that specific scene.

Below is the output of the above code. Using Pos.CENTER center-aligned all the objects. You can find a complete list of alignment options here.

Notice that the contents of the TextField remain the same even after the Scene is changed. It’s just something interesting to note.

This marks the end of the Switch between Scenes in JavaFX article. Any suggestions or contributions for CodersLegacy are more than welcome. Questions regarding the article content can be asked in the comments section below.

Источник

Java переключение между окнами

Как оказалось, JavaFX не обладает удобным инструментом, чтобы реализовать навигацию между окнами. Но это решается не сложно. Преследуемая цель:

  • минимум программного кода чтобы открыть новый экран
  • возможность перемещаться по экранам назад
  • передать данные между окнами

Для тех, кто привык воспринимать через схемы:

Каждый экран должен реализовывать интерфейс Controller (Controller.java).

public interface Controller

Изучение JavaFX, начинается с рассказа о том, что бывает файл разметки FXML и сопровождающий его класс контроллера на языке Java. Реализация нашего интерфейса, позволит задать (setView) и получить(getView) корневой элемент разметки файла FXML. Метод Show — отобразит содержимое fxml файла.

Далее, базовый для всех наших экранов класс BaseController (BaseController.java)

public class BaseController implements Controller < private Node view; @Override public Node getView() < return view; >@Override public void setView (Node view) < this.view = view; >@Override public void Show() < PreShowing(); Main.getNavigation().Show(this); PostShowing(); >public void PreShowing() < >public void PostShowing() < >>

Этот класс и берет на себя реализацию интерфейса Controller. Методы PreShowing() и PostShowing() дадут нам возможность сделать что-либо на нашем экране перед открытием или после открытия.

Каждый контроллер экрана, необходимо наследовать от BaseController:

public class View1 extends BaseController implements Initializable

А теперь о том как работает навигация — файл Navigation.java:

public class Navigation < private final Stage stage; private final Scene scene; private Listcontrollers = new ArrayList<>(); public Navigation(Stage stage) < this.stage = stage; scene = new Scene(new Pane()); stage.setScene(scene); >public Controller load(String sUrl) < try < //loads the fxml file FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(sUrl)); Node root = fxmlLoader.load(); Controller controller = fxmlLoader.getController(); controller.setView(root); return controller; >catch(Exception e) < e.printStackTrace(); >return null; > public void Show(Controller controller) < try < scene.setRoot((Parent) controller.getView()); controllers.add(controller); System.out.println("Add to history: " + controller.toString() + ". Total scenes: " + controllers.size()); >catch(Exception e) < e.printStackTrace(); >> public void GoBack() < if (controllers.size() >1) < controllers.remove(controllers.get(controllers.size() - 1)); scene.setRoot((Parent) controllers.get(controllers.size() - 1).getView()); >System.out.println("GoBack: " + controllers.get(controllers.size() - 1).toString() + ". Total scenes: " + controllers.size()); > public void ClearHistory() < while (controllers.size() >1) controllers.remove(0); System.out.println("ClearHistory. Total scenes: " + controllers.size()); > >

При создании объекта Navigation, указывается Stage — это то что принято называть окном. В JavaFX каждому Stage может быть задана Scene — сцена — область внутри Stage. В этой области будет рисоваться содержимое файла разметки fxml. В нашем случае, переключение между экранами происходит на одной сцене — будем подменять то, что должно отображаться на сцене (в окне).

Чтобы возвращаться назад, нам понадобиться история переходов по окнам. Используем для этого список:

private List controllers = new ArrayList<>();

Когда нам нужно будет сменить экран, нам останется сделать 2 шага:

  1. вызвать метод load, чтобы загрузить файл разметки FXML
  2. вызвать метод Show, который заменит содержимое сцены и добавит контроллер в список для истории.
public class Main extends Application < private static Navigation navigation; public static Navigation getNavigation() < return navigation; >@Override public void start(Stage primaryStage) throws Exception < navigation = new Navigation(primaryStage); primaryStage.setTitle("VA navigation"); primaryStage.show(); //navigate to first view Main.getNavigation().load(View1.URL_FXML).Show(); >public static void main(String[] args) < launch(args); >>

И вот теперь в любом месте достаточно написать

Main.getNavigation().load(View1.URL_FXML).Show();

и произойдет смена экрана.

Передача параметров между контроллерами.

Допустим необходимо чтобы контроллер View2 передал строку текста контроллеру View3. Для этого, объявляем в контроллере View3:

private String parameterFromView2; public String getParameterFromView2() < return parameterFromView2; >public void setParameterFromView2(String parameterFromView2)

И когда будем вызвать View3 из View2 немного изменим вызов:

View3 view3 = (View3)Main.getNavigation().load(View3.URL_FXML); view3.setParameterFromView2(txtParameter.getText()); view3.Show();

Очень часто, получаемые в контроллерах параметры должны быть использованы для тех или иных действий перед отображением на экране. Именно для этого, в базовом классе, предусмотрена функция:

@Override public void PreShowing()

Почему именно так.

Почему именно смена содержимого сцены? Потому что опробованные 2 других способа имеют недостатки.

1 способ. Если при навигации, мы бы использовали принцип: один Stage — один контроллер, то конечно бы у нас получилось все хорошо. Но что если экранов много? Это можно сравнить с просмотром некоторого сайта — когда каждая ссылка открывается в новом окне. Но при таком подходе обнаружились проблемы при отображении окон в полноэкранном режиме. Временами новое окно отображалось просто белым и причину этого, к сожалению, так и не удалось найти.

2 способ. Что если менять сцены в одном окне? Этот способ, хоть и работает, но имеет одну неприятную особенность — при смене сцены происходит некрасивое переключение — быстрое, но не приятное. Насколько удалось заметить, в этот момент окно просто исчезает на мгновение и потом появляется уже с новой сценой.

Готовый файлы можно скачать отсюда (VAnavigation)

Источник

Русские Блоги

В процессе Java FX первой возникшей проблемой была проблема переключения между несколькими окнами в Java FX. Ниже приведен метод, который я использовал.

2. Подготовка

Первый — написать два интерфейса, которые могут отображаться независимо (Main.java, Second.java). Файл FXML, используемый Main.java, — это Main.fxml; файл FXML, используемый Second.java, — Second.fxml; а класс управления, соответствующий Main.java, — MainController.java.

В Main.fxml есть только одна кнопка для запуска отображения второй страницы.

После отладки каждого интерфейса добавьте метод showWindow () в Second.java, в вызов Start () в showWindow (); в MainController.java Метод вызова события кнопки [changeWindow ()] на Second.java Вызывается метод showWindow ().

4. Исходный код

package test; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class Main extends Application < @Override public void start(Stage primaryStage) throws Exception< Parent root = FXMLLoader.load(getClass().getResource("Main.fxml")); primaryStage.setTitle("Hello World"); primaryStage.setScene(new Scene(root, 600, 400)); primaryStage.show(); >public static void main(String[] args) < launch(args); >>
package test; import java.io.IOException; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.stage.Stage; public class Second extends Application < Stage stage=new Stage(); @Override public void start(Stage primaryStage) throws Exception< Parent root = FXMLLoader.load(getClass().getResource("Second.fxml")); primaryStage.setTitle("Hello World"); primaryStage.setScene(new Scene(root, 600, 400)); primaryStage.show(); >public static void main(String[] args) < launch(args); >public void showWindow() throws Exception < start(stage); >> 
package test; import java.net.URL; import java.util.ResourceBundle; import javafx.fxml.Initializable; public class MainController implements Initializable < public MainController() < // TODO Auto-generated constructor stub >@Override public void initialize(URL arg0, ResourceBundle arg1) < // TODO Auto-generated method stub >public void changeWindow() throws Exception < test.Second second=new Second(); second.showWindow(); >> 

5. Эффект отображения

—》

Источник

Оцените статью