Javafx ile yeni çalışmaya başladıysanız, buttona veya herhangi bir kontrole tıkladığınızda yeni bir pencere açılması en temel ihtiyaçlarınızdan biridir. Yeni pencere açma işlemi C# dilinden biraz daha karmaşık olduğundan adım adım anlatmaya çalışacağım.
Eğer Javafx ile nasıl proje oluşturacağınızla ilgili temel adımları bilmiyorsanız Eclipse ile Javafx Projesi Oluşturma yazımı öncelikle okumanızı tavsiye ederim.
Projeyi oluşturduktan sonra ilk açılacak olan formu Main.fxml olarak adlandırdım. Bu formu MainController sınıfı kontrol edecek. Butona tıklayınca açılacak olan formu ise Child.fxml olarak adlandırdım. Bu formu ise ChildController sınıfı kontrol edecek. Aşağıdaki Package Explorer penceresinden projenizi kontrol edebilirsiniz.
Şimdi ise Main.fxml dosyamızı Javafx SceneBuilder programı ile açarak tasarımı ve gerekli ayarlamaları yapalım.
Aşağıdaki resime dikkat ederseniz, 2 yeri kırmızı çerçeve içersine aldım.
– Birincisi bu fxml dosyasını kontrol edecek sınıfın mutlaka seçilmesi gerekiyor.
-İkincisi ise bu butona tıklandığında hangi metodun çalıştırılacağı belirtilmeli.
Main.fxml dosyası ise işimiz bitti. Child.fxml dosyasını da açıp istediğiniz gibi düzenleyebilirsiniz. Bu dosya üzerinde herhangi bir komut çalışmayacağı için sadece tasarım yapmanız yeterli olacaktır.
Main.fxml dosyasının ilk açılışta çalıştırılması için gerekli düzenlemeleri Main.java dosyası üzerinde gösterelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package application; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; public class Main extends Application { @Override public void start(Stage primaryStage) { try { AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("Main.fxml")); Scene scene = new Scene(root,600,400); scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); primaryStage.setScene(scene); primaryStage.setTitle("Main Form"); primaryStage.setResizable(false); primaryStage.show(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { launch(args); } } |
Şimdi gelelim butona tıklandığında yapılması gereken işlemlere ve çalıştırılacak kodlara. Butona tıklandığında MainController içerisindeki childFormuAc metodu çağrılacaktır. MainController dosyasını aşağıdaki şekilde düzenleyelim.
MainController.java dosyasının içeriği
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
package application; import java.io.IOException; import java.net.URL; import java.util.ResourceBundle; import javafx.scene.Node; import javafx.event.ActionEvent; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; import javafx.stage.Modality; import javafx.stage.Stage; public class MainController implements Initializable { @Override public void initialize(URL location, ResourceBundle resources) { // TODO Auto-generated method stub } public void childFormuAc(ActionEvent event){ try { Stage stage = new Stage(); AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("Child.fxml")); stage.setScene(new Scene(root)); stage.setTitle("Child Form"); stage.initModality(Modality.WINDOW_MODAL); stage.initOwner(((Node)event.getSource()).getScene().getWindow() ); stage.show(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
Kodlara dikkat ederseniz @FXML anotation kullanmamıza gerek kalmadı. Tasarım esnasında buton kontrolünü HBox veya VBox içerisine koyarsanız bu kontroller butonları sarmaladığından tıklanma olayı çalıştırılmayacaktır.
Konuyla ilgili sorularınızı bana iletebilirsiniz.
Teşekkürler.Yararlı oldu keşke yeni dersleriniz gelse,FX hakkında türkçe kaynak çok kısıtlı.
Teşekkürler. Hintli Youtuber izlemekten ciğerim soldu. İşe yaradı!!