Javafx8 выравнивает элементы управления во внутреннем фрейме
Я недавно перешел с C#, чтобы попробовать Javafx2. Я также новичок в этом форуме. Я застрял, пытаясь реализовать внутренние кадры в Javafx. Я наткнулся на эту ссылку: Внутренние фреймы в JavaFX Мне удалось добавить jar-файл jfxtras 8 в мой проект, а также в построитель сцен 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 ответ
Мне удалось решить проблему после игры с кодом в течение некоторого времени. Что я сделал, так это создал графический интерфейс с помощью 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);
}
}
Чтобы правильно выровнять элементы, лучше всего использовать Scene Builder. Так как я планировал использовать внутренние фреймы, я скачал JAR-файл JFXtras 8 labs из команды JFxtras. JavaFx8 в настоящее время не поддерживает внутренние фреймы.
В Java-классе Main я создал статическую опорную панель, которую другие контроллеры могли унаследовать, поскольку они расширяют класс Main. Оттуда я создал окно JFXtras и загрузил содержимое моего файла fxml, используя загрузчик fxml на панели. Я добавил панель в окно Jfxtras и, наконец, добавил окно в опорную панель, созданную из класса Main.
Таким образом, для правильного выравнивания элементов GUI лучше всего использовать конструктор сцен. Чтобы совместно использовать одну и ту же опорную панель, лучше всего создать статическую опорную панель в одном классе, а остальные контроллеры наследовать от этого класса.
Теперь можно добавить пользовательские элементы пользовательского интерфейса в текущий Scene Builder, но один ограничен тем, как их использовать из построителя сцены. Вы не можете только перетаскивать пользовательские элементы управления, но не изменять их из Scene Builder.
Короткое замечание, окно jfxtras в настоящее время является самым близким способом иметь внутренние кадры в JavaFx8. В Oracle не реализованы внутренние фреймы в Javafx8. Однако окна jfxtras по той или иной причине выбивают непропорциональные элементы графического интерфейса из файла fxml. Что ж, я собираюсь сделать перерыв от кодирования с Javafx8 до появления внутренних фреймов. Я сильно полагаюсь на них. Я возвращаюсь к C# сейчас....