Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
develop:java:javafx [2023/05/21 05:43] admin создано |
develop:java:javafx [2023/06/20 15:34] (текущий) admin |
||
---|---|---|---|
Строка 4: | Строка 4: | ||
===== Сведения ===== | ===== Сведения ===== | ||
- | |||
< | < | ||
< | < | ||
Строка 14: | Строка 13: | ||
+ | <code java> | ||
+ | </ | ||
+ | </ | ||
+ | ===== Использование ===== | ||
+ | Есть как минимум пару вариантов использования, | ||
+ | < | ||
+ | < | ||
+ | |||
+ | Простая форма fxml\\ | ||
+ | (myApp/ | ||
+ | <code xml> | ||
+ | <?xml version=" | ||
+ | |||
+ | <?import javafx.geometry.*?> | ||
+ | <?import javafx.scene.control.*?> | ||
+ | <?import javafx.scene.layout.*?> | ||
+ | |||
+ | <VBox alignment=" | ||
+ | < | ||
+ | <Insets bottom=" | ||
+ | </ | ||
+ | <Label alignment=" | ||
+ | <HBox alignment=" | ||
+ | < | ||
+ | <Insets bottom=" | ||
+ | </ | ||
+ | <Button onAction="# | ||
+ | <Button onAction="# | ||
+ | </ | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Контроллер\\ | ||
+ | (myApp/ | ||
<code java> | <code java> | ||
+ | package com.sakeeper.sakeeper.controller; | ||
+ | |||
+ | import com.sakeeper.sakeeper.Sakeeper; | ||
+ | import com.sakeeper.sakeeper.model.Product; | ||
+ | import javafx.fxml.FXML; | ||
+ | import javafx.scene.control.Button; | ||
+ | |||
+ | public class BaseController { | ||
+ | private Sakeeper sakeeper; | ||
+ | @FXML | ||
+ | private Button product1; | ||
+ | @FXML | ||
+ | private Button product2; | ||
+ | public void setSakeeper(Sakeeper sakeeper){ | ||
+ | this.sakeeper = sakeeper; | ||
+ | } | ||
+ | |||
+ | @FXML | ||
+ | private void product1(){ | ||
+ | sakeeper.showVolumeWindow(new Product(" | ||
+ | } | ||
+ | @FXML | ||
+ | private void product2(){ | ||
+ | sakeeper.showVolumeWindow(new Product(" | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Основной код, главный файл | ||
+ | <code java> | ||
+ | package com.sakeeper.sakeeper; | ||
+ | |||
+ | import com.sakeeper.sakeeper.controller.BaseController; | ||
+ | import com.sakeeper.sakeeper.controller.VolumeController; | ||
+ | import com.sakeeper.sakeeper.model.Product; | ||
+ | import javafx.application.Application; | ||
+ | import javafx.event.ActionEvent; | ||
+ | import javafx.fxml.FXMLLoader; | ||
+ | import javafx.scene.Scene; | ||
+ | import javafx.scene.control.Alert; | ||
+ | import javafx.scene.control.Button; | ||
+ | import javafx.scene.layout.VBox; | ||
+ | import javafx.stage.Modality; | ||
+ | import javafx.stage.Stage; | ||
+ | |||
+ | import javafx.event.EventHandler; | ||
+ | |||
+ | import java.io.IOException; | ||
+ | |||
+ | public class Sakeeper extends Application { | ||
+ | private Stage primaryStage; | ||
+ | private VBox rootLayout; | ||
+ | |||
+ | public Sakeeper(){ | ||
+ | // list add's | ||
+ | } | ||
+ | |||
+ | public static void main(String[] args) { | ||
+ | launch(); | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void start(Stage primaryStage) throws IOException { | ||
+ | this.primaryStage = primaryStage; | ||
+ | this.primaryStage.setTitle(" | ||
+ | showBaseWindow(); | ||
+ | } | ||
+ | |||
+ | // Это основное окно | ||
+ | public void showBaseWindow(){ | ||
+ | try{ | ||
+ | FXMLLoader loader = new FXMLLoader(); | ||
+ | loader.setLocation(Sakeeper.class.getResource("/ | ||
+ | rootLayout = loader.load(); | ||
+ | |||
+ | Scene scene = new Scene(rootLayout); | ||
+ | primaryStage.setScene(scene); | ||
+ | |||
+ | BaseController controller = loader.getController(); | ||
+ | controller.setSakeeper(this); | ||
+ | primaryStage.show(); | ||
+ | |||
+ | } catch (IOException e) { | ||
+ | e.printStackTrace(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Это уже второе окно, в примере его нет | ||
+ | public void showVolumeWindow(Product selectedProduct){ | ||
+ | try{ | ||
+ | FXMLLoader loader = new FXMLLoader(); | ||
+ | loader.setLocation(Sakeeper.class.getResource("/ | ||
+ | VBox page = loader.load(); | ||
+ | |||
+ | Stage dialogStage = new Stage(); | ||
+ | dialogStage.setTitle(" | ||
+ | dialogStage.initModality(Modality.WINDOW_MODAL); | ||
+ | dialogStage.initOwner(primaryStage); | ||
+ | dialogStage.setScene(new Scene(page)); | ||
+ | |||
+ | VolumeController volumeController = loader.getController(); | ||
+ | volumeController.setDialogStage(dialogStage); | ||
+ | volumeController.setProduct(selectedProduct); | ||
+ | dialogStage.showAndWait(); | ||
- | </java> | + | } catch (IOException e) { |
+ | e.printStackTrace(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
</ | </ | ||
- | ===== ===== | + | < |
+ | < | ||
+ | Элементы так же могут создаваться в коде, размещаться на форме и задаваться свойства\\ | ||
+ | <code java> | ||
+ | public void showBaseWindow(){ | ||
+ | try{ | ||
+ | (..) | ||
+ | Button newButt | ||
+ | / | ||
+ | Alert message | ||
+ | message.setContentText(" | ||
+ | message.show(); | ||
+ | });*/ | ||
+ | |||
+ | |||
+ | / | ||
+ | if (MouseButton.SECONDARY.equals(event.getButton())) { | ||
+ | button.setFont(new Font(button.getFont().getSize() + 1)); | ||
+ | } | ||
+ | };*/ | ||
+ | |||
+ | //Create the EventHandler | ||
+ | EventHandler< | ||
+ | @Override | ||
+ | //handle method | ||
+ | public void handle(ActionEvent ev) { | ||
+ | Alert message | ||
+ | message.setContentText(" | ||
+ | message.show(); | ||
+ | } | ||
+ | }; | ||
+ | newButt.setOnAction(hnd); | ||
+ | rootLayout.getChildren().add(newButt); | ||
+ | (...) | ||
+ | } catch (IOException e) { | ||
+ | e.printStackTrace(); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Оформление ===== | ||
+ | Хорошее разделение должно придерживаться пути: | ||
+ | * логика в java (модели/ | ||
+ | * элементы формы в FXML описании | ||
+ | * а оформление в CSS | ||
+ | |||
+ | В JavaFX не совсем тот самый общеизвестный CSS, имеет собственные свойства\\ | ||
+ | Выбор компонентов либо селектором (название типа компонента, | ||
< | < | ||
- | < | + | < |
+ | <code java> | ||
+ | .button { | ||
+ | -fx-font-size: | ||
+ | } | ||
+ | |||
+ | .label { | ||
+ | // Some properties | ||
+ | } | ||
+ | |||
+ | # | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
<code java> | <code java> | ||
+ | <Label styleClass=" | ||
+ | # или в java | ||
+ | Label label = new Label(" | ||
+ | label.getStyleClass().addAll(" | ||
- | </ | + | |
+ | <Label fx: | ||
+ | # | ||
+ | Label label = new Label(" | ||
+ | label.setId(" | ||
+ | </ | ||
+ | |||
+ | Подключение | ||
+ | < | ||
+ | < | ||
+ | xmlns: | ||
+ | stylesheets=" | ||
+ | ... | ||
+ | > | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | # | ||
+ | String stylesheet = getClass().getResource("/ | ||
+ | scene.getStylesheets().add(stylesheet); | ||
+ | |||
+ | # | ||
+ | <HBox stylesheets=" | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | # | ||
+ | HBox box = new HBox(); | ||
+ | String stylesheet = getClass().getResource("/ | ||
+ | box.getStylesheets().add(stylesheet); | ||
+ | </code> | ||
</ | </ | ||
+ | |||
+ | |||