Javafx8对齐内部框架中的控件

时间:2014-01-25 22:15:26

标签: alignment javafx jinternalframe scenebuilder jfxtras

我最近从c#转移到尝试Javafx2。我也是这个论坛的新手。 我一直试图在Javafx中实现内部框架。 我偶然发现了这个链接: Internal Frames in JavaFX 我已经设法将jfxtras 8 jar文件添加到我的项目以及场景构建器2中。 但是,我坚持在窗口上对齐控件。

这是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 个答案:

答案 0 :(得分:1)

我在使用代码玩了一段时间之后设法解决了这个问题。我所做的是使用Scene Builder创建GUI并使用控制器将其与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>

以下是控制器。它们扩展了Main 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);
    }
}

为了能够正确对齐元素,最好使用“场景”构建器。由于我计划使用内部框架,我从JFxtras团队下载了JFXtras 8 labs jar文件。 JavaFx8目前不支持内部框架。

在Main java类中,我创建了一个静态的anchorpane,其他控制器可以继承它,因为它们扩展了Main类。 从那里,我创建了一个JFXtras窗口,并在窗格上使用fxml加载器加载了我的fxml文件的内容。我将窗格添加到Jfxtras窗口,最后将窗口添加到从Main类创建的anchorpane中。

总之,要正确对齐GUI元素,最好使用场景构建器。为了共享相同的anchorpane,最好在一个类中创建一个静态的anchorpane,其余的控制器从该类继承。

现在可以将自定义UI元素添加到当前场景生成器,但其中一个仅限于如何在场景构建器中使用它们。您不仅可以拖放自定义控件,还可以不从Scene Builder中修改它们

快速说明,jfxtras窗口是目前在JavaFx8中拥有内部帧的最接近方式。 Oracle尚未在Javafx8中实现内部框架。但是,jfxtras窗口出于某种原因或另一个原因导致fxml文件中的GUI元素不成比例。 好吧,我将暂停使用Javafx8进行编码,直到引入内部帧。我非常依赖它们。我现在回到c#....