2014-01-25 5 views
0

Я недавно перешел из C#, чтобы попробовать Javafx2. Я также новичок в этом форуме. Я застрял, пытаясь реализовать внутренние фреймы в Javafx. Я наткнулся на эту ссылку: Internal Frames in JavaFX Мне удалось добавить файл jfxtras 8 jar в мой проект, а также в построитель сцен 2. Однако я застрял в выравнивании элементов управления на окне.Javafx8 выравнивает элементы управления во внутреннем фрейме

Это код FXML файла:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 
<?import jfxtras.labs.scene.control.window.*?> 

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="500.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="trials.MamaCont"> 
<children><Window fx:id="wini" layoutX="122.0" layoutY="105.0" prefHeight="190.0" prefWidth="313.0" title="Window" /> 
</children></AnchorPane> 

и это код класса контроллера:

package trials; 

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import jfxtras.labs.scene.control.window.CloseIcon; 
import jfxtras.labs.scene.control.window.MinimizeIcon; 
import jfxtras.labs.scene.control.window.Window; 

/** 
* FXML Controller class 
* 
* @author smoothie 
*/ 
public class MamaCont implements Initializable { 

    /** 
    * Initializes the controller class. 
    */ 


    /*@FXML 
    private Button pb; 

    @FXML 
    private Label lb;*/ 

    @FXML 
    private Window wini; 

    /*@FXML 
    void pressed(ActionEvent event) { 
     lb.setText("Gotcha!!!...."); 
    }*/ 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
     wini.getLeftIcons().add(new CloseIcon(wini)); 
     wini.getRightIcons().add(new MinimizeIcon(wini)); 
     //wini.setVisible(false); 

     Button butt = new Button("Enter"); 
     /*butt.setLayoutX(100); 
     butt.setLayoutY(100);*/ 

     Label lab = new Label(); 
     /*lab.setLayoutX(261); 
     lab.setLayoutY(192);*/ 



     butt.setOnAction(new EventHandler<ActionEvent>() { 

      public void handle(ActionEvent t) { 
       lab.setText("I've been pressed!!!"); 
      } 
     }); 

     wini.getContentPane().getChildren().add(butt); 
     wini.getContentPane().getChildren().add(lab); 
    }  

} 

Теперь кто-нибудь знает, как я могу быть в состоянии выровнять метку так, чтобы ее под кнопкой появляется текст? Когда один щелчок на кнопке, текст с метки появляется над кнопкой, а не под ней.

Кто-нибудь смог реализовать внутренние фреймы с помощью javafx2 и не могли бы вы поделиться тем, как вам удалось разместить хорошо организованные элементы управления внутри внутренних фреймов?

Наконец, кто-нибудь знает, как сделать создатель сцены управлять дочерним элементом настраиваемого элемента управления в построителе сцен?

Мне удалось добавить элементы управления jfxtras в конструктор сцен, но, к сожалению, я не могу добавить элементы управления javafx в окно jfxtras. В этом случае я попытался добавить кнопку javafx в окно jfxtras через построитель сцен, но он никогда не работал, потому что он был добавлен в панель привязки вместо окна, в результате чего оба окна jfxtras и кнопка javafx были дочерними элементами анкерной панели ,

ответ

1

Мне удалось решить проблему после использования кода в течение некоторого времени. Я сделал, чтобы создать графический интерфейс с помощью Scene Builder и связать его с кодом Java с помощью контроллера. Ниже приведены FXML файлы:

tingiGUI.fxml 

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="202.0" prefWidth="325.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ting.TingiCont"> 
<children><Button fx:id="si" layoutX="137.0" layoutY="112.0" mnemonicParsing="false" onAction="#Onyesha" text="Show" /><Label fx:id="lbi" layoutX="100.0" layoutY="70.0" prefHeight="17.0" prefWidth="124.0" /> 
</children></Pane> 

tinGUI.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="200.0" prefWidth="325.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ting.TinCont"> 
<children><Button fx:id="bb" layoutX="137.0" layoutY="88.0" mnemonicParsing="false" onAction="#Boom" text="BOOM" /><Label fx:id="lbx" layoutX="84.0" layoutY="147.0" prefHeight="17.0" prefWidth="157.0" /> 
</children></Pane> 

tingGUI.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="219.0" prefWidth="323.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ting.TingCont"> 
<children><Button fx:id="cmb" layoutX="127.0" layoutY="126.0" mnemonicParsing="false" onAction="#clicked" text="Click me..." /><Label fx:id="lb" layoutX="93.0" layoutY="80.0" prefHeight="17.0" prefWidth="121.0" /> 
</children></AnchorPane> 

Ниже приведены контроллеры. Они расширяют основной класс java.

TinCont.java

package ting; 

import java.io.IOException; 
import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.Parent; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.Pane; 
import jfxtras.labs.scene.control.window.CloseIcon; 
import jfxtras.labs.scene.control.window.Window; 

public class TinCont extends Main implements Initializable{ 

    @FXML 
    private Button bb; 

    @FXML 
    private Label lbx; 

    /** 
    * Initializes the controller class. 
    */ 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    } 


    @FXML 
    void Boom(ActionEvent event) throws IOException { 
     lbx.setText("KAMIKAZE!!!!!!"); 


     Pane coco = FXMLLoader.load(getClass().getResource("tingiGUI.fxml")); 

     Window x = new Window("TINGI WINDOW"); 

     // set the window position to 10,10 (coordinates inside canvas) 
     x.setLayoutX(10); 
     x.setLayoutY(10); 

     // define the initial window size 
     x.setPrefSize(330, 210); 
     x.setResizableWindow(false); 

     // either to the left 
     x.getRightIcons().add(new CloseIcon(x)); 

     // add some content 
     x.getContentPane().getChildren().add(coco); 
     anchor.getChildren().add(x); 
    } 
} 

TingiCont.java

package ting; 

import javafx.fxml.FXML; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.event.ActionEvent; 

/** 
* Created by Udeman on 2/1/14. 
*/ 
public class TingiCont { 

    @FXML 
    private Label lbi; 

    @FXML 
    private Button si; 

    @FXML 
    void Onyesha(ActionEvent event) { 

     lbi.setText("You made it..."); 
    } 

} 

TingCont.java

package ting; 

import java.io.IOException; 
import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.Pane; 
import jfxtras.labs.scene.control.window.CloseIcon; 
import jfxtras.labs.scene.control.window.Window; 

public class TingCont extends Main implements Initializable{ 

    @FXML 
    private Label lb; 

    @FXML 
    private Button cmb; 

    @Override 
    public void initialize(URL url, ResourceBundle resourceBundle) { 

    } 

    @FXML 
    void clicked(ActionEvent event) throws IOException { 


     lb.setText("I've been clicked..."); 

     Pane balou = FXMLLoader.load(getClass().getResource("tinGUI.fxml")); 
     Window w = new Window("TIN WINDOW"); 

     // set the window position to 10,10 (coordinates inside canvas) 
     w.setLayoutX(10); 
     w.setLayoutY(10); 

     // define the initial window size 
     w.setPrefSize(330, 210); 
     //w.setResizableWindow(false); 

     // either to the left 
     w.getRightIcons().add(new CloseIcon(w)); 

     // add some content 
     w.getContentPane().getChildren().add(balou); 
     anchor.getChildren().add(w); 

     //((Node)(event.getSource())).getScene().getWindow().hide(); 

    } 
} 

И это главный класс. Main.java

package ting; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import jfxtras.labs.scene.control.window.CloseIcon; 
import jfxtras.labs.scene.control.window.Window; 


public class Main extends Application { 

    public static AnchorPane anchor = new AnchorPane(); 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 

     Pane sunda = FXMLLoader.load(getClass().getResource("tingGUI.fxml")); 
     sunda.setLayoutX(130); 
     sunda.setLayoutY(60); 
     anchor.getChildren().add(sunda); 

     primaryStage.setTitle("TING"); 
     primaryStage.setScene(new Scene(anchor, 600, 400)); 
     primaryStage.show(); 
    } 


    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Чтобы иметь возможность правильно выровнять элементы лучше всего использовать построитель сцены. Поскольку я планировал использовать внутренние фреймы, я загрузил jf-файл JFXtras 8 labs из команды JFxtras. В настоящее время JavaFx8 не поддерживает внутренние фреймы.

В главном классе java я создал статическую привязку, которую могли бы наследовать другие контроллеры, поскольку они расширяют класс Main. Оттуда я создал окно JFXtras и загрузил содержимое моего файла fxml с помощью загрузчика fxml на панели. Я добавил панель в окно Jfxtras и, наконец, добавил окно к анкерной панели, которая была создана из класса Main.

Таким образом, чтобы правильно согласовать элементы GUI, лучше всего использовать конструктор сцен. Чтобы разделить одну и ту же самую привязку, лучше всего создать статический якорь в одном классе, а остальные контроллеры - наследовать от этого класса.

Теперь можно добавить пользовательские элементы пользовательского интерфейса к текущему строителю сцен, но один из них ограничен тем, как использовать их из создателя сцены. Вы можете не только перетаскивать пользовательские элементы управления, но не изменять их из Scene Builder

Быстрое замечание, окно jfxtras в настоящее время является самым близким способом иметь внутренние фреймы в JavaFx8. Oracle не реализовали внутренние фреймы в Javafx8. Тем не менее, окна jfxtras по той или иной причине продувают пропорции элементов GUI из файла fxml. Ну, я собираюсь сделать перерыв от кодирования с Javafx8 до тех пор, пока не будут введены внутренние фреймы. Я сильно полагаюсь на них. Я возвращаюсь на C# на данный момент ....

 Смежные вопросы

  • Нет связанных вопросов^_^