Автор Тема: JavaFX Позициониране на бутон в динамичен прозорец  (Прочетена 1716 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

Meniak

  • Full Member
  • ***
  • Благодарности
  • -Казани: 5
  • -Получени: 4
  • Публикации: 224
Здравейте, имам едни прозорчета с който всъщност извеждам съобщения за грешки и съответствия. На тези прозорчета има по един или два бутона който искам да позиционирам в долния десен ъгъл на прозореца. Проблема е че тези прозорци нямат фиксирана дължина за да знам какъв леяулт на бутона да задам. Дължината на прозореца се определя от текста който влиза в него а текста идва от това какво е въвел потребителя.

Чек са по просто че се омазах пак:

Как да задам леялт на бутона върху прозореца, да се намира в болния десен ъгъл като прозореца се разширяват според текста който вкарва потребителя.

Ето какво сам и написал за момента и това ми върши перфектна работа пустия бутон ме изеде.
public static void errorMessage(String text) {
        Pane root = new Pane();
        Stage stage = new Stage();
        stage.initModality(Modality.APPLICATION_MODAL);
        Scene scene = new Scene(root);

        Toolkit.getDefaultToolkit().beep();

        Image img = new Image("/images/no.png");
        ImageView imgView = new ImageView(img);
        imgView.setLayoutX(10);
        imgView.setLayoutY(10);
        root.getChildren().add(imgView);

        Label label = new Label();
        label.setText(text);
        label.setFont(Font.font(14));
        label.setStyle("-fx-padding: 0 8px 0 0");
        label.setLayoutY(25);
        label.setLayoutX(60);
        root.getChildren().add(label);

        Button btn = new Button("Добре");
        btn.setLayoutX(60);
        btn.setLayoutY(60);
        btn.setDefaultButton(true);
        root.getChildren().add(btn);
        btn.setOnAction((ActionEvent event) -> {
            stage.close();
        });

        stage.setScene(scene);
        stage.setHeight(120);
        stage.setTitle("Грешка");
        stage.setResizable(false);
        stage.initStyle(StageStyle.UTILITY);
        stage.show();
    }

А ако знаете и някакъв по кадърен начин за извеждане на грешки и съответствия че сам благодарен да споделите.

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: JavaFX Позициониране на бутон в динамичен прозорец
« Отговор #1 -: 16 Октомври 2014, 18:36:16 »
Много не ти разбрах питането, но виж ControlsFX
И по-точно това тук, или поне нещо подобно. Снимката е от примерите на страницата с документацията.


Тъй като днес имах малко повече свободно време реших да я пробвам тази библиотека и горепосоченият диалог. Та ще ти нахвърлям примерния си код.

Main.java
Код: Java
  1. import java.io.IOException;
  2.  
  3. import javafx.application.Application;
  4. import javafx.fxml.FXMLLoader;
  5. import javafx.scene.Scene;
  6. import javafx.scene.layout.Pane;
  7. import javafx.stage.Stage;
  8.  
  9. public class Main extends Application {
  10.  
  11.         private Stage primaryStage;
  12.         private Pane rootLayout;
  13.  
  14.         @Override
  15.         public void start(Stage primaryStage) {
  16.                 this.primaryStage = primaryStage;
  17.                 this.primaryStage.setTitle("AppMakesBoom");
  18.                 initRootLayout();
  19.         }
  20.  
  21.         public void initRootLayout() {
  22.                 try {
  23.                         // Load root layout from fxml file.
  24.                         FXMLLoader loader = new FXMLLoader();
  25.                         loader.setLocation(Main.class.getResource("RootLayout.fxml"));
  26.                         rootLayout = (Pane) loader.load();
  27.  
  28.                         // Show the scene containing the root layout.
  29.                         Scene scene = new Scene(rootLayout);
  30.                         primaryStage.setScene(scene);
  31.  
  32.                         primaryStage.show();
  33.                 } catch (IOException e) {
  34.                         e.printStackTrace();
  35.                 }
  36.         }
  37.        
  38.         public static void main(String[] args) {
  39.                 launch(args);
  40.         }
  41. }

RootLayout.fxml
Код: XML
  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <?import javafx.scene.text.*?>
  4. <?import javafx.scene.effect.*?>
  5. <?import java.lang.*?>
  6. <?import javafx.scene.control.*?>
  7. <?import javafx.scene.layout.*?>
  8.  
  9. <Pane prefHeight="200.0" prefWidth="200.0"
  10.      xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.boomMaker.testFX.RootLayoutController">
  11.    <children>
  12.       <Button fx:id="btnBoom" alignment="CENTER" layoutX="44.0" layoutY="76.0" mnemonicParsing="false"
  13.              onAction="#btnBoomPressed" prefHeight="49.0" prefWidth="113.0" text="Boom!">
  14.          <font>
  15.             <Font size="24.0" />
  16.          </font>
  17.      </Button>
  18.    </children>
  19. </Pane>

RootLayoutController.java
Код: Java
  1. import org.controlsfx.dialog.Dialogs;
  2.  
  3. import javafx.fxml.FXML;
  4. import javafx.scene.control.Button;
  5. import javafx.stage.Stage;
  6.  
  7. public class RootLayoutController {
  8.  
  9.         @FXML
  10.         private Button btnBoom;
  11.  
  12.         @FXML
  13.         private void btnBoomPressed() {
  14.                 Throwable t = new Throwable("BOOM BOOM BOOM BOOM BOOM !!!!!");
  15.                 StackTraceElement[] trace = new StackTraceElement[] {
  16.                         new StackTraceElement("","","",0)
  17.                 };
  18.                 t.setStackTrace(trace);
  19.              
  20.                 Dialogs.create()
  21.                                 .owner((Stage) btnBoom.getScene().getWindow())
  22.                                 .title("Exception Dialog")
  23.                                 .masthead("BOOOM")
  24.                                 .message("Here comes the BOOOM!")
  25.                                 .showException(t);
  26.         }
  27. }
  28.  

Струва ми се че мешаш awt, swing  и javafx, което не е добре. Не знам ти как работиш точнсо с JavaFX, но ти препоръчвам да ползваш JavaFX Scene Builder 2.0. С него импортваш .fxml файловете си и си ги обработваш както си искаш.
« Последна редакция: 18 Октомври 2014, 17:47:22 от kjufte »

Meniak

  • Full Member
  • ***
  • Благодарности
  • -Казани: 5
  • -Получени: 4
  • Публикации: 224
Re: JavaFX Позициониране на бутон в динамичен прозорец
« Отговор #2 -: 24 Октомври 2014, 14:22:03 »
Мерси много. понеже доста време никои не беше писал по темата мислех че е зарязана ама явно не е.
Разгледах кода и ще ми е много полезен.

Пиша само JavaFX. Swing i AWT не знам какво е така да се каже.  JavaFX Scene Builder 2.0. е задължителното ми инструмент ама там всичко е хардкорнато и не може да си викаш едни и същи прозорец с различни данни в него (в моя пример текст).

Малко да разясня. Аз сам направил извеждането на грешки и съответствия така че викам един прозорец и в него има картинка за грешка или съответствие, бутонче дето скрива прозореца при кликване и един текст дето казва каква е грешката и понеже прозореца е един и същ а грешката различна значи прозореца се разширява спрямо дължината на текста дето описва грешката. По този начин след като прозореца е с не фиксирана дължина аз не мога/не знам кат да задам позиция на бутона да се намира да речем 10px bottom left
« Последна редакция: 24 Октомври 2014, 17:50:30 от Meniak »

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: JavaFX Позициониране на бутон в динамичен прозорец
« Отговор #3 -: 24 Октомври 2014, 22:12:49 »
Scene Builder ползваш само за да си направиш подредбата на елементите на екрана. Което трябва да ти е динамично го допълваш в кода.

Прозореца на диалога ти съдържа явно грешните елементи :) Ето ти един пример за собствен диалог без ControlsFX.

OwnDialog.java
Код: Java
  1. package ownDialog;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javafx.fxml.FXMLLoader;
  6. import javafx.scene.Scene;
  7. import javafx.scene.layout.Pane;
  8. import javafx.stage.Modality;
  9. import javafx.stage.Stage;
  10.  
  11. public class OwnDialog {
  12.        
  13.         private Pane root;
  14.         private Stage stage;
  15.         private String label;
  16.         private String message;
  17.         private OwnDialogController controller;
  18.                
  19.         public OwnDialog(String title, String label, String message) {
  20.                 controller= null;
  21.                 this.stage = new Stage();
  22.                 stage.initModality(Modality.APPLICATION_MODAL);
  23.                 stage.setTitle(title);
  24.                 initLayout();
  25.                 setLabel(label);
  26.                 setMessage(message);
  27.                 stage.show();
  28.         }
  29.        
  30.         public void initLayout() {
  31.                 try {
  32.                         // Load root layout from fxml file.
  33.                         FXMLLoader loader = new FXMLLoader();
  34.                         loader.setLocation(OwnDialog.class.getResource("OwnDialog.fxml"));
  35.                         root = (Pane) loader.load();
  36.                         controller = ((OwnDialogController) loader.getController());
  37.                         // Show the scene containing the root layout.
  38.                         Scene scene = new Scene(root);
  39.                         stage.setScene(scene);
  40.                 } catch (IOException e) {
  41.                         e.printStackTrace();
  42.                 }
  43.         }
  44.        
  45.         public void setTitle(String t) {
  46.                 if (stage.isShowing()) { return; }
  47.                 stage.setTitle(t);
  48.         }
  49.        
  50.         public void setMessage(String m) {
  51.                 if(controller == null) { return; }
  52.                 this.message = m;
  53.                 controller.setMessage(message);
  54.         }
  55.        
  56.         public void setLabel(String l) {
  57.                 if(controller == null) { return; }
  58.                 this.label = l;
  59.                 controller.setLabel(label);
  60.         }
  61. }

OwnDialog.fxml
Код: XML
  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <?import java.lang.*?>
  4. <?import javafx.scene.control.*?>
  5. <?import javafx.scene.layout.*?>
  6. <?import javafx.scene.text.*?>
  7.  
  8. <Pane prefHeight="142.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.boomMaker.ownDialog.OwnDialogController">
  9.    <children>
  10.       <Button fx:id="btn" layoutX="496.0" layoutY="104.0" mnemonicParsing="false" onAction="#btnPressed" prefHeight="25.0" prefWidth="82.0" text="Who cares..." />
  11.       <Label fx:id="label" layoutX="23.0" layoutY="13.0" prefHeight="17.0" prefWidth="555.0" textAlignment="RIGHT">
  12.          <font>
  13.             <Font size="18.0" />
  14.          </font>
  15.       </Label>
  16.       <TextArea fx:id="message" editable="false" layoutX="23.0" layoutY="50.0" prefHeight="43.0" prefWidth="555.0" />
  17.    </children>
  18. </Pane>

OwnDialogController.java
Код: Java
  1. package ownDialog
  2.  
  3. import javafx.fxml.FXML;
  4. import javafx.scene.control.Button;
  5. import javafx.scene.control.Label;
  6. import javafx.scene.control.TextArea;
  7.  
  8. public class OwnDialogController {
  9.         @FXML
  10.         private Label label;
  11.        
  12.         @FXML
  13.         private Button btn;
  14.        
  15.         @FXML
  16.         private TextArea message;
  17.        
  18.         @FXML
  19.         private void btnPressed() {
  20.                 btn.getScene().getWindow().hide();
  21.         }
  22.  
  23.         public void setMessage(String msg) {
  24.                 message.setText(msg);
  25.         }
  26.        
  27.         public void setLabel(String lbl) {
  28.                 label.setText(lbl);
  29.         }
  30. }

Сега напасваме RootLayoutController  от горния пример.

Код: Java
  1. import ownDialog.OwnDialog;
  2.  
  3. import javafx.fxml.FXML;
  4. import javafx.scene.control.Button;
  5.  
  6. public class RootLayoutController {
  7.  
  8.         @FXML
  9.         private Button btnBoom;
  10.  
  11.         @FXML
  12.         private void btnBoomPressed() {        
  13.                 String msg = "  Имаше една Нула\n"
  14.                    + "кръгла като О,\n"
  15.                    + "тя не беше сторила никому зло,\n"
  16.                    + "но тъй като нямаше стойност, горката,\n"
  17.                    + "щом я съглеждаха, пищяха числата:\n"
  18.                    + "— Извинявайте! Бързам! Ще закъснея! —\n"
  19.                    + "да не би да ги видят със нея.\n"
  20.                    + "Но ето, тя срещна числото Едно,\n"
  21.                    + "което не беше с много стойност и то\n"
  22.                    + "и също се чувстваше жалко,\n"
  23.                    + "понеже бе много малко.\n"
  24.                    + "И каза му Нулата: — Я, със мене ела! —\n"
  25.                    + "И купиха двамата една стара кола\n"
  26.                    + "и смело поеха — пам-пам-пам — по шосето.\n"
  27.                    + "И ето:\n"
  28.                    + "Четворката, Двойката, Тройката\n"
  29.                    + "веднага изменят си стойката,\n"
  30.                    + "Пет усмихнат ги гони,\n"
  31.                    + "Шест им прави поклони.\n"
  32.                    + "Какво бе се там случило?\n"
  33.                    + "Десет бе се получило.\n"
  34.                    + "(Нали колата бе малка,\n"
  35.                    + "само с една седалка,\n"
  36.                    + "от Единица\n"
  37.                    + "наред със Нула\n"
  38.                    + "Десетица\n"
  39.                    + "се бе надула).\n"
  40.                    + "И стана тъй, че оттогава\n"
  41.                    + "за Нулата потръгна слава,\n"
  42.                    + "всички цифри я канеха,\n"
  43.                    + "подир нея се кланяха\n"
  44.                    + "и я хвалеха гласно\n"
  45.                    + "и я слагаха вдясно\n"
  46.                    + "(защото тайно\n"
  47.                    + "беше ги страх,\n"
  48.                    + "да не мръдне случайно\n"
  49.                    + "на ляво от тях!)\n"
  50.                    + "и изобщо извадиха те заключение\n"
  51.                    + "че и малките нули имат свое значение.\n";
  52.                
  53.                 new OwnDialog("This Title sucks!", "Some serious shit just happened...", msg);
  54.         }
  55. }