JavaRush /جاوا بلاگ /Random-UR /جاوا ایف ایکس کا تعارف

جاوا ایف ایکس کا تعارف

گروپ میں شائع ہوا۔
ایک دن مجھے اپنی ضروریات کے لیے ایک چھوٹی سی ڈیسک ٹاپ ایپلی کیشن لکھنے کا خیال آیا - غیر ملکی الفاظ سیکھنے کے لیے ایک چھوٹی سی لغت کی طرح - اور میں نے اپنے دماغ کو ریک کرنا شروع کیا، میں یہ کیسے کرسکتا ہوں؟ قدرتی طور پر، پہلی چیز جو میرے ذہن میں آئی وہ سوئنگ تھی۔ سب نے شاید سوئنگ کے بارے میں سنا ہوگا ۔ یہ صارف، گرافیکل انٹرفیس بنانے کے لیے ایک لائبریری ہے۔ اس حقیقت کی وجہ سے کہ ہمارے پیارے اوریکل نے ابھی تک سوئنگ کو مکمل طور پر ترک نہیں کیا ہے، اسے متروک نہیں سمجھا جاتا ہے، اور ایپلی کیشنز اب بھی اس پر چلتی ہیں۔ تاہم، اب اسے سوئنگ کے ذریعے جدید نہیں بنایا جا رہا ہے، اور اوریکل کے لوگوں نے ہمیں اس بات کا ذائقہ دیا ہے کہ JavaFX کا مستقبل کیا ہے۔ اور درحقیقت، JavaFX Swing اجزاء کو بطور سروس فراہم کنندہ استعمال کرتا ہے)

JavaFX کیا ہے؟

JavaFX بنیادی طور پر جاوا کے لیے ایک GUI ٹول کٹ ہے۔ یہاں ایک چھوٹا سا اختلاف ہوگا، اور ہم یاد رکھیں گے کہ GUI کیا ہے : گرافیکل یوزر انٹرفیس - گرافیکل یوزر انٹرفیس یوزر انٹرفیس کی ایک قسم ہے جس میں تمام عناصر (بٹن، مینیو، شبیہیں، فہرستیں) صارف کے سامنے پیش کیے جاتے ہیں۔ ڈسپلے تصویروں، گرافکس کی شکل میں بنائے جاتے ہیں۔ کمانڈ لائن انٹرفیس کے برعکس، GUI میں صارف کو ان پٹ ڈیوائسز کا استعمال کرتے ہوئے نظر آنے والی اشیاء تک بے ترتیب رسائی حاصل ہوتی ہے۔ اکثر، انٹرفیس عناصر کو استعاروں کی شکل میں لاگو کیا جاتا ہے اور صارف کی تفہیم کو آسان بنانے کے لیے ان کی خصوصیات اور مقصد کو ظاہر کیا جاتا ہے۔ JavaFX کا مقصد جاوا میں گیمز اور ڈیسک ٹاپ ایپلی کیشنز بنانا ہے۔ درحقیقت، یہ جاوا کے لیے مجوزہ نئے GUI ٹول کی وجہ سے سوئنگ کی جگہ لے گا۔ یہ ہمیں GUI لے آؤٹ فائلوں (XML) کو اسٹائل کرنے اور CSS کا استعمال کرتے ہوئے مزید خوبصورت بنانے کی بھی اجازت دیتا ہے، جیسا کہ ہم ویب ایپلیکیشنز میں استعمال ہوتے ہیں۔ JavaFX ایک ہی GUI ٹول کٹ میں مربوط 3D گرافکس کے ساتھ ساتھ آڈیو، ویڈیو اور ایمبیڈڈ نیٹ ورکنگ ایپلی کیشنز کو بھی ہینڈل کرتا ہے... یہ سیکھنا آسان ہے اور اچھی طرح سے بہتر بنایا گیا ہے۔ یہ بہت سے آپریٹنگ سسٹمز کے ساتھ ساتھ ونڈوز، یونیکس سسٹمز اور میک او ایس کو سپورٹ کرتا ہے۔ جاوا ایف ایکس کا تعارف - 3

JavaFX خصوصیات:

  • JavaFX ابتدائی طور پر گرافیکل انٹرفیس حصوں کے ایک بڑے سیٹ کے ساتھ آتا ہے، جیسے کہ تمام قسم کے بٹن، ٹیکسٹ فیلڈز، ٹیبلز، ٹریز، مینیو، چارٹس وغیرہ، جس کے نتیجے میں ہمارا کافی وقت بچ جائے گا۔
  • JavaFX اکثر CSS طرزیں استعمال کرتا ہے، اور ہم اسے جاوا کوڈ میں کرنے کے بجائے GUI بنانے کے لیے ایک خاص FXML فارمیٹ استعمال کرنے کے قابل ہو جائیں گے۔ یہ جاوا کوڈ کے ساتھ کھیلے بغیر GUI کو تیزی سے ترتیب دینا یا ظاہری شکل یا ساخت کو تبدیل کرنا آسان بناتا ہے۔
  • JavaFX میں ڈایاگرام کے استعمال کے لیے تیار حصے ہیں لہذا جب بھی آپ کو بنیادی خاکہ کی ضرورت ہو ہمیں انہیں شروع سے لکھنے کی ضرورت نہیں ہے۔
  • JavaFX اس کے علاوہ 3D گرافکس سپورٹ کے ساتھ آتا ہے، جو اکثر مفید ہوتا ہے اگر ہم کسی قسم کی گیم یا اس جیسی ایپلی کیشنز تیار کر رہے ہوں۔
آئیے اپنی ونڈو کے اہم اجزاء پر ایک نظر ڈالتے ہیں:
  • اسٹیج بنیادی طور پر ایک ارد گرد کی کھڑکی ہے جو ایک ابتدائی کینوس کے طور پر کام کرتی ہے اور باقی اجزاء پر مشتمل ہوتی ہے۔ ایک درخواست کے کئی مراحل ہو سکتے ہیں، لیکن کسی بھی صورت میں ایسا ایک جزو ہونا چاہیے۔ بنیادی طور پر، اسٹیج مرکزی کنٹینر اور داخلے کا نقطہ ہے۔
  • منظر - اسٹیج کے مواد کو دکھاتا ہے (جیسے گھونسلے کی گڑیا)۔ ہر مرحلے میں کئی اجزاء شامل ہوسکتے ہیں - منظر، جو آپس میں تبدیل ہوسکتے ہیں۔ اندرونی طور پر، اس کو ایک آبجیکٹ گراف کے ذریعے لاگو کیا جاتا ہے جسے Scene Graph کہا جاتا ہے (جہاں ہر عنصر ایک نوڈ ہوتا ہے، جسے Node بھی کہا جاتا ہے )۔
  • نوڈس کنٹرولز ہیں، جیسے کہ لیبل بٹن، یا یہاں تک کہ لے آؤٹ، جن کے اندر متعدد نیسٹڈ اجزاء ہوسکتے ہیں۔ ہر منظر میں ایک نیسٹڈ نوڈ ہو سکتا ہے، لیکن یہ ایک سے زیادہ اجزاء کے ساتھ لے آؤٹ ہو سکتا ہے۔ نیسٹنگ ملٹی لیول ہو سکتی ہے، جس میں دیگر لے آؤٹ اور باقاعدہ اجزاء شامل ہوں۔ اس طرح کے ہر نوڈ کا اپنا شناخت کنندہ، انداز، اثرات، ریاست اور ایونٹ ہینڈلرز ہوتے ہیں۔
جاوا ایف ایکس کا تعارف - 4 تو آئیے تھوڑا سا کوڈ کی طرف بڑھیں۔ چونکہ میں جاوا 8 استعمال کرتا ہوں، اس لیے مجھے کسی قسم کا انحصار کرنے کی ضرورت نہیں ہے، کیونکہ JavaFx ڈیفالٹ کے طور پر JDK میں ہے (جیسا کہ جاوا 9.10 میں ہے)، لیکن اگر ہمارے پاس Java 11+ ہے، تو ہمیں maven repository پر جانے کی ضرورت ہے اور اسے وہاں کے انحصار سے کھینچیں۔

JavaFX: استعمال کی مثالیں۔

ہم ایک طریقہ کے ساتھ ایک باقاعدہ کلاس بناتے ہیں main(انٹری پوائنٹ):
public class AppFX extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
pimarySatge.show();
    }
}
یہاں ہماری کلاس وراثت میں ملتی ہے javafx.application.Application(جو ہمارے پاس بگگا باکس سے ہے)۔ launch()بنیادی طور پر ہم اپنی ونڈو کو لانچ کرنے کے لیے سٹیٹک ایپلیکیشن کا طریقہ کہتے ہیں ۔ اس کے علاوہ، ہمارا خیال شکایت کرے گا کہ ہم نے درخواست کے طریقہ کار کو نافذ نہیں کیا ہے، startجو ہم بالآخر کرتے ہیں۔ یہ کس لیے ہے؟ اور خواص (ہماری ونڈو کی فعالیت) کو منظم کرنے کے قابل ہونے کے لیے۔ ایسا کرنے کے لیے، ہم ایک آنے والی دلیل کا استعمال کرتے ہیں primaryStageجس پر ہم ایک طریقہ کہتے ہیں showتاکہ ہم ونڈو کو لانچ ہوتے دیکھ سکیں main۔ آئیے اپنے طریقہ کو تھوڑا سا بھرتے ہیں start:
public void start(Stage primaryStage) throws Exception {
    primaryStage.setTitle("Dogs application");
    primaryStage.setWidth(500);
    primaryStage.setHeight(400);

    InputStream iconStream =
    getClass().getResourceAsStream("/images/someImage.png");
    Image image = new Image(iconStream);
    primaryStage.getIcons().add(image);

    Button button = new Button("WOF WOF ???'");

    button.setOnAction(e -< {
      Alert alert = new Alert(Alert.AlertType.INFORMATION, "WOF WOF WOF!!!");
        alert.showAndWait();
    });
    Scene primaryScene = new Scene(button);
    primaryStage.setScene(primaryScene);

    primaryStage.show();
}
تو ہم یہاں کیا دیکھتے ہیں؟ آئیے اس کے ذریعے لائن بذریعہ چلتے ہیں: 2 - ونڈو کا نام خود سیٹ کریں (اسٹیج) 3.4 - اس کے طول و عرض 6.7 سیٹ کریں - فائل (آئیکن) پر پڑھنے کے سلسلے کا راستہ مقرر کریں جاوا ایف ایکس کا تعارف - 58 - فائل کو بطور تصویری آبجیکٹ بنائیں، جو کنسٹرکٹر 9 میں گزرنے والے اسٹریم کے ذریعے اصلی فائل سے منسلک ہے - ونڈو 11 کے اوپری پینل میں ایک آئیکن سیٹ کریں - ایک بٹن آبجیکٹ 13-16 بنائیں - جب بٹن دبایا جائے تو ردعمل سیٹ کریں 17 - ایک منظر بنائیں جہاں ہم اپنا بٹن 18 رکھتے ہیں - منظر کو اپنی مشترکہ ونڈو 20 پر رکھیں - ونڈو کے لیے مرئیت کا جھنڈا سیٹ کریں اور اس کے نتیجے میں ہمیں اپنے پسندیدہ پیسلز کا استقبال کرنے کے لیے ایک چھوٹی سی ونڈو ملتی ہے: جاوا ایف ایکس کا تعارف - 6ہر چیز Swing سے کہیں زیادہ آسان نظر آتی ہے، ہے نا؟ لیکن یہ ابھی ختم نہیں ہوا۔ کسی ایپلیکیشن کو ظاہر کرنے کے لیے تمام کوڈ لکھنا اچھا نہیں ہے؛ آپ کو اسے مزید قابل فہم بنانے کے لیے اسے کسی طرح تقسیم کرنا ہوگا (ایک ٹوکری میں گرافیکل اجزاء، دوسری میں منطق)۔ اور یہاں xml تصویر میں آتا ہے... اوہ میرے خدا، xml؟ بالکل۔ خاص طور پر، ہم JavaFX - FXML کے لیے اس کے مخصوص نفاذ کا استعمال کرتے ہیں، جس میں ہم ایپلیکیشن کے گرافیکل اجزاء اور ان کی خصوصیات (ہر قسم کے سائز وغیرہ) کی وضاحت کرتے ہیں، اور پھر اسے ایک کنٹرولر سے جوڑتے ہیں، جو منطق کو منظم کرنے میں مدد کرتا ہے۔ آئیے اس xML کی ایک مثال دیکھیں:
<?xml version="1.0" encoding="UTF-8"?>
<?language javascript?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>

<VBox xmlns="http://javafx.com/javafx"  xmlns:fx="http://javafx.com/fxml"
   id="Dogs application" prefHeight="200" prefWidth="300" alignment="center">

  <Label text="Wow wow?"/>

  <Button fx:id="mainButton" text="Greeting" onAction="buttonClicked()"/>

    <fx:script>
       function buttonClicked() {
            mainButton.setText("Wow wow wow!!!")
       }
    </fx:script>
</VBox>
2 - اسکرپٹ کی زبان جو ہم استعمال کرتے ہیں 4-6 - درآمد شدہ ڈیٹا 8-9 Vbox - ایک کنٹینر جو ذیلی اجزاء کو ایک لائن پر رکھتا ہے۔ 11 - کچھ متن ڈسپلے کریں 13 - ایک بٹن، جب کلک کیا جاتا ہے، ہم اسکرپٹ میں بیان کردہ طریقہ 15-18 لائنوں پر استعمال کرتے ہیں۔ طریقہ میں اس xML فائل کو کال کرنے کے لیے کوڈ ہونا چاہیے start، لیکن اب یہ اتنا اہم نہیں ہے، اور ہم اسے چھوڑ دے گا (نیچے اس فائل کو کھینچنے کی ایک مثال ہوگی)۔ تو، xml، یقیناً، اچھا ہے (لیکن بہت اچھا نہیں)، انہیں دستی طور پر لکھنا بہت مبہم ہے، کیا یہ پچھلی صدی نہیں ہے؟ جاوا ایف ایکس کا تعارف - 7

پیش کر رہا ہے JavaFX SceneBuilder

یہ اس مقام پر ہے کہ (ڈرم رول) کام میں آتا ہے - SceneBuilder جاوا ایف ایکس میں سین بلڈر ایک ایسا ٹول ہے جس کی مدد سے ہم اپنی ونڈوز کو گرافیکل انٹرفیس کی شکل میں ڈیزائن کر سکتے ہیں اور پھر انہیں محفوظ کر سکتے ہیں، اور یہ پروگرام، نتیجہ کی بنیاد پر، xml فائلیں بنائیں جسے ہم اپنی درخواست میں بہتر بنائیں گے۔ اس fmxl بلڈر کا انٹرفیس کچھ اس طرح لگتا ہے: جاوا ایف ایکس کا تعارف - 8

ایک چھوٹا سا اختلاف۔ JavaFX اسباق

میں انسٹالیشن کی تفصیلات اور اس ٹول کا تفصیلی مطالعہ چھوڑ دوں گا۔ یہ مزید دریافت کرنے کے لائق موضوعات ہیں۔ لہذا، میں اب بھی JavaFX اسباق کے چند دلچسپ لنکس چھوڑوں گا: ایک (جاوا ایف ایکس پر ایک آن لائن ٹیوٹوریل) اور دو (ایک اور اچھا ٹیوٹوریل)۔ آئیے ایک چھوٹی سی مثال کے ذریعے چلتے ہیں جس کا میں نے خاکہ تیار کیا ہے۔ آخر میں مجھے کچھ ایسا ملا: جاوا ایف ایکس کا تعارف - 9
(کتے کی رجسٹریشن کے لیے کھڑکی کی طرح)
جب آپ کتے کو منتخب کرتے ہیں اور ڈیلیٹ بٹن دباتے ہیں، تو کتا ہماری فہرست سے ہٹا دیا جاتا ہے۔ جب آپ چار ٹانگوں والے دوست کو منتخب کرتے ہیں اور اس کی فیلڈز تبدیل کرتے ہیں، اور ایڈٹ بٹن دبانے کے بعد، کتے کی معلومات اپ ڈیٹ ہوجاتی ہیں۔ جب ہم نیا بٹن دباتے ہیں، تو ایک ونڈو پاپ اپ ہوتی ہے تاکہ نئے کتے کا ریکارڈ بنایا جا سکے (اس کے نام سے شروع کریں): جاوا ایف ایکس کا تعارف - 10پھر Save پر کلک کریں اور پہلی ونڈو میں اس کے باقی فیلڈز کو بھریں، اور پھر Edit بٹن پر کلک کریں۔ محفوظ کریں آسان لگتا ہے، ٹھیک ہے؟ آئیے دیکھتے ہیں کہ یہ ہماری جاوا ایپلی کیشن میں کیسا نظر آئے گا۔ شروع کرنے کے لیے، میں یہاں صرف ان دو ونڈوز کے لیے xml لے آؤٹ چھوڑ دوں گا جس میں پیدا کیا گیا ہے SceneBuilder: پہلا (بنیادی):
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<AnchorPane prefHeight="300.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.tutorial.controller.BaseController">
   <children>
      <SplitPane dividerPositions="0.29797979797979796" prefHeight="300.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
        <items>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
               <children>
                  <TableView fx:id="dogs" layoutX="-2.0" layoutY="-4.0" prefHeight="307.0" prefWidth="190.0" AnchorPane.bottomAnchor="-5.0" AnchorPane.leftAnchor="-2.0" AnchorPane.rightAnchor="-13.0" AnchorPane.topAnchor="-4.0">
                    <columns>
                      <TableColumn fx:id="nameList" prefWidth="100.33334350585938" text="Nickname" />
                    </columns>
                     <columnResizePolicy>
                        <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
                     </columnResizePolicy>
                  </TableView>
               </children>
            </AnchorPane>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
               <children>
                  <Label layoutX="49.0" layoutY="25.0" text="Person Details" AnchorPane.leftAnchor="5.0" AnchorPane.topAnchor="5.0" />
                  <GridPane accessibleText="erreererer" gridLinesVisible="true" layoutX="5.0" layoutY="31.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="31.0">
                    <columnConstraints>
                      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                    </columnConstraints>
                    <rowConstraints>
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                    </rowConstraints>
                     <children>
                        <Label prefHeight="17.0" prefWidth="70.0" text="Nickname" />
                        <Label text="Breed" GridPane.rowIndex="1" />
                        <Label text="Age" GridPane.rowIndex="2" />
                        <Label text="City" GridPane.rowIndex="3" />
                        <Label text="Level of training" GridPane.rowIndex="4" />
                        <TextField fx:id="breed" GridPane.columnIndex="1" GridPane.rowIndex="1" />
                        <TextField fx:id="age" GridPane.columnIndex="1" GridPane.rowIndex="2" />
                        <TextField fx:id="city" GridPane.columnIndex="1" GridPane.rowIndex="3" />
                        <TextField fx:id="levelOfTraining" GridPane.columnIndex="1" GridPane.rowIndex="4" />
                        <TextField fx:id="name" GridPane.columnIndex="1" />
                     </children>
                  </GridPane>
                  <Button layoutX="251.0" layoutY="259.0" mnemonicParsing="false" onAction="#create" text="New" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="230.0" AnchorPane.rightAnchor="130.0" AnchorPane.topAnchor="260.0" />
                  <Button layoutX="316.0" layoutY="262.0" mnemonicParsing="false" onAction="#edit" text="Edit" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="290.0" AnchorPane.rightAnchor="70.0" AnchorPane.topAnchor="260.0" />
                  <Button layoutX="360.0" layoutY="262.0" mnemonicParsing="false" onAction="#delete" text="Delete" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="350.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="260.0" />
               </children>
            </AnchorPane>
        </items>
      </SplitPane>
   </children>
</AnchorPane>
دوسرا (نئے کتے بنانے کے لیے):
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="200.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.tutorial.controller.NewDogController">
   <children>
      <GridPane layoutX="31.0" layoutY="25.0" prefHeight="122.0" prefWidth="412.0">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" maxWidth="185.0" minWidth="10.0" prefWidth="149.0" />
          <ColumnConstraints hgrow="SOMETIMES" maxWidth="173.0" minWidth="10.0" prefWidth="146.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <Label prefHeight="48.0" prefWidth="178.0" text="Please, write name:">
               <font>
                  <Font size="20.0" />
               </font>
            </Label>
            <TextField fx:id="nickName" prefHeight="36.0" prefWidth="173.0" GridPane.columnIndex="1" />
         </children>
      </GridPane>
      <Button layoutX="222.0" layoutY="149.0" mnemonicParsing="false" onAction="#ok" prefHeight="37.0" prefWidth="95.0" text="Save" />
      <Button layoutX="325.0" layoutY="149.0" mnemonicParsing="false" onAction="#cansel" prefHeight="37.0" prefWidth="95.0" text="Cansel" />
   </children>
</AnchorPane>
فولڈر کا ڈھانچہ کیسا دکھتا ہے: جاوا ایف ایکس کا تعارف - 11جیسا کہ آپ دیکھ سکتے ہیں، کچھ خاص نہیں ہے، ایسے کنٹرولرز ہیں جو مخصوص ونڈوز کی نمائندگی کرتے ہیں، ایسے ماڈل موجود ہیں جو ہمارے ڈیٹا کی نمائندگی کرتے ہیں۔ آئیے اس کلاس پر ایک نظر ڈالتے ہیں جو ایپلیکیشن لانچ کرتی ہے (ایپلی کیشن کا نفاذ): @Data
public class AppFX extends Application {

    private Stage primaryStage;
    private AnchorPane rootLayout;
    private ObservableList listDog = FXCollections.observableArrayList();

    public AppFX() {
        listDog.add(new Dog("Fluffy", "Pug", 8, "Odessa", 2));
        listDog.add(new Dog("Archie", "Poodle", 3, "Lviv", 6));
        listDog.add(new Dog("Willie", "Bulldog", 5, "Kiev", 4));
        listDog.add(new Dog("Hector", "Shepherd", 9, "Minsk", 6));
        listDog.add(new Dog("Duncan", "Dachshund", 1, "Hogwarts", 9));
    }
یہاں ہمیں ایک کنسٹرکٹر نظر آتا ہے جو ہمارے ابتدائی ڈیٹا کو پُر کرے گا (جسے ہم ایک خاص شیٹ - Observable List میں محفوظ کرتے ہیں)۔
public static void main(String[] args) {
        Application.launch();
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("Dogs application");
        showBaseWindow();
}
کچھ خاص نہیں - mainاور عمل درآمد start()جو ایپلیکیشن کو لانچ کرتا ہے:
public void showBaseWindow() {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(AppFX.class.getResource("/maket/rootWindow.fxml"));
            rootLayout = loader.load();
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);
            InputStream iconStream = getClass().getResourceAsStream("/icons/someImage.png");
            Image image = new Image(iconStream);
            primaryStage.getIcons().add(image);
            BaseController controller = loader.getController();
            controller.setAppFX(this);
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
لہذا، یہاں ہم وہ طریقہ دیکھتے ہیں جسے ہم اصل میں لانچ کرتے ہیں start()، یعنی وہ طریقہ جو ہماری بیس ونڈو کی سیٹنگز کو سیٹ کرتا ہے۔ جیسے وسائل میں xml لے آؤٹ میں: اسے ایک آئیکن دینا، اسے کسی مخصوص کنٹرولر سے جوڑنا، اور کنٹرولر کو thisکلاس کا لنک دینا)
public void showCreateWindow(Dog dog) {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(AppFX.class.getResource("/maket/new.fxml"));
            AnchorPane page = loader.load();
            Stage dialogStage = new Stage();
            dialogStage.setTitle("Wow Wow Wow");
            dialogStage.initModality(Modality.WINDOW_MODAL);
            dialogStage.initOwner(primaryStage);
            dialogStage.setScene(new Scene(page));
            CreateController controller = loader.getController();
            controller.setDialogStage(dialogStage);
            controller.setDog(dog);
            dialogStage.showAndWait();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
یہاں ہم وہ طریقہ دیکھتے ہیں جو دوسری ونڈو کی ظاہری شکل کے لیے ذمہ دار ہے - ایک نیا ریکارڈ بنانے کے لیے ونڈو (ایک نئے کتے کا نام)۔ ہم نے کنٹرولر، ایکس ایم ایل لے آؤٹ، اسٹیج وغیرہ بھی ترتیب دیا ہے... اگلی کلاس جس پر ہم غور کریں گے وہ ہمارے کتے کی نمائندگی کرنے والا ماڈل ہوگا (اس کے بارے میں معلومات): @Data
public class Dog {

    private StringProperty name;
    private StringProperty breed;
    private IntegerProperty age;
    private StringProperty city;
    private IntegerProperty levelOfTraining;

    public Dog(String name, String breed, int age, String city, int levelOfTraining) {
        this.name = new SimpleStringProperty(name);
        this.breed = new SimpleStringProperty(breed);
        this.age = new SimpleIntegerProperty(age);
        this.city = new SimpleStringProperty(city);
        this.levelOfTraining = new SimpleIntegerProperty(levelOfTraining);
    }

    public Dog() {
        name = new SimpleStringProperty();
        breed = null;
        age = null;
        city = null;
        levelOfTraining = null;
    }
}
یہاں ہمیں دو کنسٹرکٹرز نظر آتے ہیں۔ ایک تمام دلائل کے ساتھ تقریباً باقاعدہ ہے (تقریباً، کیونکہ ہم سادہ قسم کے خصوصی FX ریپر استعمال کرتے ہیں) اور ایک کنسٹرکٹر بغیر کسی دلیل کے: ہم اسے نیا کتا بناتے وقت استعمال کرتے ہیں، جس میں شروع میں صرف ایک ہوتا ہے۔ نام بنیادی ونڈو کے لیے کنٹرولر: @Data
public class BaseController {

    @FXML
    private TableView dogs;
    @FXML
    private TableColumn nameList;
    @FXML
    private TextField name;
    @FXML
    private TextField breed;
    @FXML
    private TextField age;
    @FXML
    private TextField city;
    @FXML
    private TextField levelOfTraining;
    private AppFX appFX;
یہاں ہم اپنے آبجیکٹ فیلڈز کو دیکھتے ہیں، لیکن ٹیکسٹ فیلڈ فارمیٹ میں۔ یہ ایک فارمیٹ ہے جو ٹیکسٹ ان پٹ فیلڈ کی نمائندگی کرتا ہے۔ @FXML ایک تشریح ہے جو جاوا کوڈ اور ہمارے لے آؤٹ کے متعلقہ آبجیکٹ (بٹن، فیلڈ، یا کچھ اور) کو جوڑنے کے لیے ڈیزائن کیا گیا ہے۔
@FXML
private void initialize() {
    nameList.setCellValueFactory(
            cellData -> cellData.getValue().getName());
    dogs.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> showDogsInformation(newValue));
}
یہاں ہم فہرست میں دائیں طرف کتے کے نام ظاہر کرنے کا طریقہ دیکھتے ہیں (اس کا @FXML تشریح JavaFX TableView لے آؤٹ جزو سے منسلک ہے)۔
public void setAppFX(AppFX appFX) {
    this.appFX = appFX;
    dogs.setItems(appFX.getListDog());
}

private void showDogsInformation(Dog dog) {
    if (dog != null) {
        name.setText(dog.getName() != null ? dog.getName().getValue() : null);
        breed.setText(dog.getBreed() != null ? dog.getBreed().getValue() : null);
        age.setText(dog.getAge() != null ? String.valueOf(dog.getAge().get()) : null);
        city.setText(dog.getCity() != null ? dog.getCity().getValue() : null);
        levelOfTraining.setText(dog.getLevelOfTraining() != null ? String.valueOf(dog.getLevelOfTraining().get()) : null);
    } else {
        name.setText("");
        breed.setText("");
        age.setText("");
        city.setText("");
        levelOfTraining.setText("");
    }
}
پہلے طریقہ میں ہم اس کلاس کے لیے ایک اندرونی حوالہ ترتیب دیتے ہوئے دیکھتے ہیں جو ایپلیکیشن کو لاگو کرتی ہے (تاکہ ہم دوسری ونڈو کو کال کرنے کے لیے اس کے طریقہ کار کو کال کر سکیں)، اور ابتدائی فہرست کو ظاہر کرنے کے لیے ترتیب دیں۔ دوسرا چیک کرتا ہے کہ آیا موجودہ کتے کے پاس کچھ ڈیٹا ہے، اور اس کی بنیاد پر ٹیکسٹ فیلڈز سیٹ کرتا ہے:
@FXML
    private void delete() {
        int selectedIndex = dogs.getSelectionModel().getSelectedIndex();
        dogs.getItems().remove(selectedIndex);
    }

    @FXML
    private void edit() {
        int selectedIndex = dogs.getSelectionModel().getSelectedIndex();
        dogs.getItems().set(selectedIndex, new Dog(name.getText(), breed.getText(), Integer.valueOf(age.getText()), city.getText(), Integer.valueOf(levelOfTraining.getText())));
    }

    @FXML
    private void create() {
        Dog someDog = new Dog();
        appFX.showCreateWindow(someDog);
        if (someDog.getName() != null && !someDog.getName().getValue().isEmpty()) {
            appFX.getListDog().add(someDog);
        }
    }
}
یہاں ہم بٹنوں سے وابستہ بیس ونڈو کے تین طریقے دیکھتے ہیں۔ جاوا ایف ایکس کا تعارف - 12
  • حذف کریں - انڈیکس کے ذریعہ منتخب کردہ (منتخب) کتے کو حذف کریں۔
  • ترمیم کریں - منتقل شدہ ڈیٹا کے ساتھ ایک نیا کتا بنائیں، اور اسے پہلے والے کے بجائے سیٹ کریں؛
  • تخلیق کریں - ہم ایک نیا کتا بناتے ہیں اور تخلیق ونڈو کو کال کرنے کے طریقہ کار کو کال کرتے ہیں، ایک نئی چیز کو پاس کرتے ہیں، اور جسے بند کرنے کے بعد، اگر نام کالعدم نہیں ہے، تو نئے پالتو جانور کو محفوظ کریں۔
آگے بڑھتے ہوئے، کتے کو بنانے کے لیے ونڈو کنٹرولر: @Data
public class CreateController {
    private Stage dialogStage;
    private Dog dog;

    @FXML
    private TextField nickName;

    @FXML
    private void ok() {
        if (nickName != null && !nickName.getText().isEmpty()) {
            dog.setName(new SimpleStringProperty(nickName.getText()));
            dialogStage.close();
        }
    }

    @FXML
    private void cansel() {
        dialogStage.close();
    }
}
یہاں ہمیں ونڈو میں ٹیکسٹ فیلڈ کے ساتھ کنکشن نظر آتا ہے، سیو اور کینسل بٹن پر کارروائی کرتے ہوئے، جو کسی طرح ونڈو کو بند کر دیتے ہیں۔ جیسا کہ آپ دیکھ سکتے ہیں، اپنی چھوٹی ایپلی کیشن میں زیادہ سہولت کے لیے میں نے Lombok کا استعمال کیا، ورنہ کوڈ بہت بڑھ چکا ہوتا، اور میں اسے اپنے جائزے میں فٹ نہ کر پاتا۔ میرے پاس آج کے لیے شاید یہی ہے۔ آج ہم مختصر طور پر بنیادی تصورات اور JavaFX استعمال کرنے کی ایک مثال سے واقف ہوئے، اور ہم چھوٹے ڈیسک ٹاپ ایپلی کیشنز بنا سکتے ہیں (اضافی معلومات کا استعمال کرتے ہوئے، جو خوش قسمتی سے انٹرنیٹ پر بہت زیادہ ہے)۔ اور آپ، بدلے میں، جیسے))
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION