当前位置: 首页 > 知识库问答 >
问题:

Javafx8在内部框架中对齐控件

高飞翮
2023-03-14

我最近从c#转向尝试Javafx2。我也是这个论坛的新手。我一直在尝试在Javafx中实现内部框架。我偶然发现了这个链接: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窗口中。在本例中,我试图通过scene builder将javafx按钮添加到jfxtras窗口中,但它从未起作用,因为它被添加到了锚定窗格中,而不是窗口中,从而导致jfxtras窗口和javafx按钮都是锚定窗格的子项。

共有1个答案

澹台逸明
2023-03-14

在玩弄了一段时间代码后,我设法解决了这个问题。我所做的是使用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>

廷吉。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>

廷贵。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类。

罐头。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目前不支持内部帧。

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

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

现在可以将自定义UI元素添加到当前场景生成器中,但如何从场景生成器中使用这些元素受到限制。您不能仅拖放自定义控件,也不能从场景生成器中修改它们

快速评论一下,jfxtras窗口是目前在JavaFx8中拥有内部框架的最接近的方式。Oracle尚未在Javafx8中实现内部框架。但是,jfxtras窗口出于这样或那样的原因从fxml文件中吹出不成比例的GUI元素。好吧,我将从使用Javafx8编码中Rest一下,直到引入内部框架。我非常依赖它们。我暂时返回c#......

 类似资料:
  • 是否可以在JavaFX中制作相同的内部帧?

  • 在Twitter的Bootstrap框架中是否有一组对齐文本的类? 例如,我有一些带有合计的表,我希望它们向右对齐... 而且

  • 嗨,我在容器内创建了三个帧,每个帧都有三个按钮,执行最小值,最大值和关闭功能。令人惊讶的是,只有一帧在工作,其余三帧不起作用。你能不能整理一下。

  • 我正在尝试对齐一个div内的项目,我读了一些问题,但仍然有这个疑问。 我目前拥有的: 代码是 null null 类别描述的不起作用:(我希望它位于块的最右侧。 将设置为显式长度不是一个选项,因为“类别描述”的内容是可变的。

  • 如何将专辑封面对齐到卡片的右侧。我尝试使用属性,但这似乎不起作用。谁能帮忙吗? null null

  • 我有一个“p”标记,它是内联的(我不想显示它块),但当我使用时,它不起作用。 HTML: CSS: