Input controls (ဒေတာ ထည့်တဲ့ control များ: form တည်ဆောက်ခြင်း)

IA (Internal Assessment) အတွက် tool တွေပါ၊ စာမေးပွဲ ခေါင်းစဉ် မဟုတ်ပါဘူး။ ဒါတွေက ကိုယ့် IA အတွက် ပြင်သုံးရမယ့် JavaFX (Java နဲ့ desktop app တည်ဆောက်တဲ့ library) form (ဒေတာ ဖြည့်ရတဲ့ အကွက်တွေ ပါတဲ့ အပိုင်း) တည်ဆောက်တဲ့ ပုံစံတွေပါ။ IA ဆိုတာ IB သင်တန်းမှာ ကျောင်းသားတစ်ယောက်ချင်း ကိုယ်တိုင် တည်ဆောက်ရပြီး ကျောင်းက ဆရာက အမှတ်ပေးတဲ့ အပိုင်းပါ။ ဒီထဲက ဘာကိုမှ စာမေးပွဲမှာ မမေးပါဘူး၊ IA ကလည်း ကိုယ်တိုင် လုပ်တဲ့ အလုပ် ဖြစ်ရပါမယ်။

ဒီစာမျက်နှာက form တစ်ခုကို တည်ဆောက်တဲ့ control (button၊ text box စတဲ့ user သုံးတဲ့ အစိတ်အပိုင်း) တွေ အကြောင်းပါ: ရွေးစရာ တစ်ခုကို ရွေးခြင်း၊ ရွေးစရာတွေကို ဖွင့်ခြင်း၊ ပိတ်ခြင်း၊ စာရင်းထဲက ရွေးခြင်း၊ ရက်စွဲ ရွေးခြင်းနဲ့ field တစ်ခုကို ဂဏန်းပဲ လက်ခံအောင် ကန့်သတ်ခြင်း တို့ပါ။

ဒီကို ပထမဆုံး ရောက်တာလား။ Start here: how every recipe fits together (ဒီမှာ စပါ: recipe တိုင်း ဘယ်လို ချိတ်ဆက်ထားလဲ) ကို အရင် ဖတ်ပါ။ အဲဒီ စာမျက်နှာက ကိုယ်ပြင်ရမယ့် နေရာ နှစ်ခုကို ရှင်းပြပါတယ်: SceneBuilder (FXML layout ကို ပုံနဲ့ မြင်ရင်း ပြင်တဲ့ editor) ထဲက layout (control တွေကို screen ပေါ်မှာ စီစဉ်ထားပုံ) နဲ့ controller (user လုပ်တာတွေကို ကိုင်တွယ်ပြီး Model နဲ့ screen တွေကို ချိတ်ပေးတဲ့ class) ပါ။ Recipe (ချက်ချင်း ယူသုံးလို့ရတဲ့ code နမူနာ) တိုင်း မှီခိုနေတဲ့ fx:id ချိတ်ဆက်မှုကိုလည်း ရှင်းပြပါတယ်။


ရွေးစရာ တစ်ခုတည်းကို အတိအကျ ရွေးခြင်း

ဒါက ဘာလုပ်ပေးလဲ: radio button (အုပ်စုထဲက တစ်ခုပဲ ရွေးလို့ရတဲ့ အဝိုင်း ခလုတ်) တွေကို တစ်ကြိမ်မှာ တစ်ခုပဲ ရွေးလို့ရအောင် အုပ်စုဖွဲ့ပေးပြီး user ဘယ်ဟာကို ရွေးလဲ ဖတ်ပါတယ်။

IA မှာ ဘယ်အချိန် သုံးမလဲ: အမျိုးအစား တစ်ခု၊ ခက်ခဲမှု အဆင့် တစ်ခု၊ ငွေပေးချေနည်း တစ်ခု ဒါမှမဟုတ် အရွယ်အစား တစ်ခုကို ရွေးတာမျိုးပါ၊ ဆိုလိုတာက တစ်ခု ရွေးရင် ကျန်တာတွေ ရွေးလို့ မရတဲ့ ရွေးစရာတွေပါ။

SceneBuilder ထဲမှာ (layout): ရွေးစရာ တစ်ခုစီအတွက် RadioButton တစ်ခုစီ ထည့်ပြီး တစ်ခုစီကို fx:id (rbSmall, rbMedium, rbLarge) ပေးပါ။ ဒီမှာ ToggleGroup (RadioButton တွေထဲက တစ်ခုပဲ ရွေးထားနိုင်အောင် စုပေးတဲ့ အုပ်စု) တစ်ခုကို button တစ်ခုပေါ် ဆွဲချပြီး အဲဒီ group ကို တခြား button တွေမှာ ပြန်သုံးကာ အုပ်စုဖွဲ့လို့ ရပါတယ်၊ ဒါမှမဟုတ် အောက်မှာ ပြထားသလို code ထဲမှာ အုပ်စုဖွဲ့လို့ ရပါတယ်။

<RadioButton fx:id="rbSmall" text="Small" />
<RadioButton fx:id="rbMedium" text="Medium" />
<RadioButton fx:id="rbLarge" text="Large" />

Controller ထဲမှာ (.java file):

Import line များ:

import javafx.fxml.FXML;
import javafx.scene.control.RadioButton;
import javafx.scene.control.ToggleGroup;

Controller:

@FXML private RadioButton rbSmall;
@FXML private RadioButton rbMedium;
@FXML private RadioButton rbLarge;

private final ToggleGroup sizeGroup = new ToggleGroup();

@FXML
public void initialize() {
    rbSmall.setToggleGroup(sizeGroup);     // the group lets only one be on at once
    rbMedium.setToggleGroup(sizeGroup);
    rbLarge.setToggleGroup(sizeGroup);
    rbSmall.setSelected(true);             // a sensible default
}

private String selectedSize() {
    RadioButton chosen = (RadioButton) sizeGroup.getSelectedToggle();
    if (chosen == null) {
        return null;                       // nothing picked
    }
    return chosen.getText();
}

ကိုယ်ပိုင် logic ထည့်ရမယ့် နေရာ: ကိုယ့်ရဲ့ handler (button နှိပ်တာလို event ဖြစ်တဲ့အခါ run တဲ့ code၊ ဥပမာ Save ဒါမှမဟုတ် Next button ရဲ့ handler) ကနေ selectedSize() ကို ခေါ်ပြီး ရလဒ်ပေါ် မူတည်ပြီး လုပ်ဆောင်ပါ:

String size = selectedSize();
// your IA logic here: use the chosen option

ကိုယ့် project နဲ့ ကိုက်အောင် ပြင်ပါ:

  • Button တွေနဲ့ group ကို ကိုယ့် ရွေးစရာတွေနဲ့ ကိုက်အောင် နာမည်ပြောင်းပါ။
  • ToggleGroup က အဓိက အပိုင်းပါ: သူမပါရင် radio button တွေက သီးခြားစီ အလုပ်လုပ်ပြီး user က တစ်ခုထက် ပိုပြီး ရွေးလို့ ရသွားပါမယ်။
  • getSelectedToggle() က ရွေးထားတဲ့ toggle (ဖွင့်/ပိတ် ပြောင်းလို့ရတဲ့ ခလုတ်) ကို return (ရလဒ်အဖြစ် ပြန်ပေး) လုပ်ပါတယ်၊ ဘာမှ မရွေးထားရင် null (ဘာ object ကိုမှ မညွှန်းတဲ့ တန်ဖိုး) ကို return လုပ်ပါတယ်။ Default (မူလ သတ်မှတ်ထားတဲ့) ရွေးချယ်မှု တစ်ခု ထားလိုက်ရင် null ဖြစ်တဲ့ အခြေအနေကို ရှောင်နိုင်ပါတယ်။

သတိထားရမယ့် အချက်များ:

  • Layout ထဲက fx:id တန်ဖိုးတွေက @FXML field (@FXML အမှတ်အသားနဲ့ FXML ထဲက control ကို ချိတ်ထားတဲ့ field) နာမည်တွေနဲ့ အတိအကျ ကိုက်ရပါမယ်၊ မဟုတ်ရင် screen ကို load လုပ်လို့ မရပါဘူး။
  • ToggleGroup ကို FXML ထဲမှာလည်း <ToggleGroup fx:id="sizeGroup" /> နဲ့ ဖန်တီးပြီး radio button တစ်ခုစီကို toggleGroup="$sizeGroup" နဲ့ အဲဒီ group ဆီ ညွှန်းလို့ ရပါတယ်။ Group ကို နေရာ တစ်ခုတည်းမှာပဲ သတ်မှတ်ပါ၊ နှစ်နေရာလုံးမှာ မသတ်မှတ်ပါနဲ့။
  • Group ကို ပေးဖို့ မေ့သွားရင် radio button တိုင်းက သီးခြားစီ ဖြစ်နေပြီး “တစ်ခုပဲ ရွေးလို့ရ” ဆိုတဲ့ အလုပ်လုပ်ပုံ ပျောက်သွားပါတယ်။

တွဲသုံးလို့ရတဲ့ recipe များ: ရွေးစရာတွေကို ဖွင့်ခြင်း၊ ပိတ်ခြင်း၊ Tell the user something (user ကို တစ်ခုခု အသိပေးခြင်း)။


ရွေးစရာတွေကို ဖွင့်ခြင်း၊ ပိတ်ခြင်း

ဒါက ဘာလုပ်ပေးလဲ: တစ်ခုနဲ့ တစ်ခု မဆိုင်ဘဲ သီးခြားစီ ရွေးလို့ရတဲ့ ရွေးစရာတွေအတွက် checkbox (အမှန်ခြစ် အကွက်) တစ်ခုကို ခြစ်ထားလား မထားလား ဖတ်ပါတယ်။

IA မှာ ဘယ်အချိန် သုံးမလဲ: “remember me” (ကျွန်တော့်ကို မှတ်ထားပါ)၊ “include weekends” (စနေ၊ တနင်္ဂနွေ ပါ ထည့်ပါ) လို user ကိုယ်တိုင် ရွေးမှ ဖွင့်တဲ့ setting တွေ၊ ဒါမှမဟုတ် တစ်ပြိုင်နက် အရေအတွက် မကန့်သတ် ရွေးလို့ရတဲ့ pizza ပေါ် ထည့်စရာ (topping) စာရင်း မျိုးပါ။

SceneBuilder ထဲမှာ (layout): CheckBox တစ်ခု ထည့်ပြီး chkIncludeWeekends ဆိုတဲ့ fx:id ပေးပါ။ ဒီမှာ တခြား ထည့်စရာ မရှိပါဘူး။

<CheckBox fx:id="chkIncludeWeekends" text="Include weekends" />

Controller ထဲမှာ (.java file):

Import line များ:

import javafx.fxml.FXML;
import javafx.scene.control.CheckBox;

Controller:

@FXML private CheckBox chkIncludeWeekends;

@FXML
private void handleGenerate() {
    boolean includeWeekends = chkIncludeWeekends.isSelected();
    // your IA logic here: branch on includeWeekends
    if (includeWeekends) {
        // include weekend days
    } else {
        // skip them
    }
}

ကိုယ်ပိုင် logic ထည့်ရမယ့် နေရာ: // your IA logic here လို့ မှတ်ထားတဲ့ နေရာပါ၊ အဲဒီမှာ ခြစ်ထားတာ၊ မခြစ်ထားတာပေါ် မူတည်ပြီး လုပ်ဆောင်ပါ။ isSelected() ကို ဖတ်တာက wiring (control တွေနဲ့ code ကို ချိတ်ဆက်ပေးတဲ့ အသင့် code) ပါ။

ကိုယ့် project နဲ့ ကိုက်အောင် ပြင်ပါ:

  • Checkbox ကို ကိုယ့် setting နဲ့ ကိုက်အောင် နာမည်ပြောင်းပါ။
  • isSelected() က ခြစ်ထားရင် true၊ မခြစ်ထားရင် false ကို return လုပ်ပါတယ်။ လက်ရှိ အခြေအနေကို လိုတဲ့ အချိန်တိုင်း ဖတ်ပါ။

သတိထားရမယ့် အချက်များ:

  • chkIncludeWeekends ဆိုတဲ့ fx:id က @FXML field နာမည်နဲ့ အတိအကျ ကိုက်ရပါမယ်။ မကိုက်ရင် screen ကို load လုပ်လို့ ရပေမဲ့ field က null ဖြစ်နေပြီး handleGenerate run တဲ့အခါ error ဖြစ်ပါလိမ့်မယ်။
  • ရွေးစရာတွေ သီးခြားစီ ဖြစ်ရင် checkbox တွေကို သုံးပြီး တစ်ခုတည်းကို အတိအကျ ရွေးရမယ့်အခါ radio button တွေကို သုံးပါ။ နှစ်မျိုးကို မှားသုံးမိရင် user တွေ ရှုပ်ထွေးသွားပါတယ်။

တွဲသုံးလို့ရတဲ့ recipe များ: ရွေးစရာ တစ်ခုတည်းကို အတိအကျ ရွေးခြင်း၊ စာရင်းထဲက ရွေးခြင်း။


စာရင်းထဲက ရွေးခြင်း

ဒါက ဘာလုပ်ပေးလဲ: ရွေးစရာတွေ ပါတဲ့ drop-down list (နှိပ်လိုက်ရင် အောက်ကို ကျလာတဲ့ ရွေးချယ်စရာ စာရင်း) တစ်ခုကို ပြပြီး user ရွေးလိုက်တဲ့ တစ်ခုကို ဖတ်ပါတယ်။

IA မှာ ဘယ်အချိန် သုံးမလဲ: radio button တွေ သုံးရင် နေရာ အရမ်းယူမယ့် စာရင်း ရှည်ရှည်ထဲက အမျိုးအစား တစ်ခု၊ နိုင်ငံ တစ်ခု၊ အတန်း အုပ်စု တစ်ခု ဒါမှမဟုတ် တန်ဖိုး တစ်ခုခုကို ရွေးတာမျိုးပါ။

SceneBuilder ထဲမှာ (layout): ComboBox (ရွေးချယ်စရာ စာရင်း) တစ်ခု ထည့်ပြီး cmbCategory ဆိုတဲ့ fx:id ပေးပါ။ ရွေးစရာတွေကို အောက်က code ကနေ ဖြည့်ပါတယ်။

<ComboBox fx:id="cmbCategory" />

Controller ထဲမှာ (.java file):

Import line များ:

import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;

Controller:

@FXML private ComboBox<String> cmbCategory;

@FXML
public void initialize() {
    cmbCategory.getItems().addAll("Fruit", "Vegetable", "Dairy", "Other");
}

private String chosenCategory() {
    return cmbCategory.getValue();      // null until the user picks one
}

ကိုယ်ပိုင် logic ထည့်ရမယ့် နေရာ: ကိုယ့် handler ကနေ chosenCategory() ကို ခေါ်ပြီး ရလဒ်ပေါ် မူတည်ပြီး လုပ်ဆောင်ပါ:

String category = chosenCategory();
// your IA logic here: use the chosen category (check for null first)

ကိုယ့် project နဲ့ ကိုက်အောင် ပြင်ပါ:

  • addAll(...) ကို ပေးထားတဲ့ စာရင်းကို ကိုယ့် ရွေးစရာတွေနဲ့ အစားထိုးပါ။
  • getValue() က ရွေးထားတဲ့ item ကို return လုပ်ပါတယ်၊ ဘာမှ မရွေးရသေးရင် null ကို return လုပ်ပါတယ်၊ ဒါကြောင့် မသုံးခင် null ဟုတ်မဟုတ် စစ်ပါ။
  • ComboBox နောက်က <String> က type parameter (ထောင့်ကွင်း < > ထဲမှာ ရေးပြီး သိမ်းမယ့် ဒေတာ type ကို သတ်မှတ်တာ) ပါ၊ ArrayList<String> နဲ့ သဘောတရား တူပါတယ်: ဒီ box က စာသား ကိုင်ထားတယ်လို့ ပြောတာပါ။ ကိုယ်ပိုင် object တွေကိုလည်း ကိုင်ထားခိုင်းလို့ ရပေမဲ့ String နဲ့ စပါ။

သတိထားရမယ့် အချက်များ:

  • cmbCategory ဆိုတဲ့ fx:id က @FXML field နာမည်နဲ့ အတိအကျ ကိုက်ရပါမယ်၊ မဟုတ်ရင် screen ကို load လုပ်လို့ မရပါဘူး။
  • ChoiceBox က ComboBox နဲ့ ဆင်တူပြီး ပိုရိုးရှင်းတဲ့ control ပါ။ ပုံသေ စာရင်း တိုတိုအတွက် အလုပ်လုပ်ပုံ တူပေမဲ့ feature နည်းပါတယ်၊ ဒါကြောင့် ပိုပေါ့ပါးတဲ့ control ကို တမင် လိုချင်တာ မဟုတ်ရင် ComboBox ကို သုံးပါ။
  • ComboBox မှာ default အနေနဲ့ user က box ထဲ ကိုယ်တိုင် စာရိုက်ထည့်လို့ မရတာကြောင့် ကိုယ့်စာရင်းထဲကပဲ ရွေးလို့ ရပါတယ်။ အမျိုးအစား ရွေးတဲ့အခါ များသောအားဖြင့် ဒါက လိုချင်တဲ့ ပုံစံပါ။

တွဲသုံးလို့ရတဲ့ recipe များ: ရွေးစရာ တစ်ခုတည်းကို အတိအကျ ရွေးခြင်း၊ Fill a table from your data (ကိုယ့် ဒေတာနဲ့ table ကို ဖြည့်ခြင်း)။


ရက်စွဲ ရွေးခြင်း

ဒါက ဘာလုပ်ပေးလဲ: ပေါ်လာတဲ့ ပြက္ခဒိန် အကွက်လေး (pop-up) ကနေ user ကို ရက်စွဲ တစ်ခု ရွေးခိုင်းပြီး အဲဒါကို LocalDate (အချိန် မပါဘဲ ရက်စွဲကိုပဲ သိမ်းတဲ့ Java class) အဖြစ် ဖတ်ပါတယ်။

IA မှာ ဘယ်အချိန် သုံးမလဲ: ပြီးရမယ့် ရက် (due date)၊ ကြိုတင် စာရင်းပေးတဲ့ (booking) ရက်၊ မွေးနေ့ ဒါမှမဟုတ် user က မှားရိုက်နိုင်တဲ့ စိတ်ကြိုက် စာသား မဟုတ်ဘဲ တကယ့် ရက်စွဲ လိုတဲ့ field တိုင်းပါ။

SceneBuilder ထဲမှာ (layout): DatePicker (ပြက္ခဒိန်ကနေ ရက်စွဲ ရွေးတဲ့ control) တစ်ခု ထည့်ပြီး dpDueDate ဆိုတဲ့ fx:id ပေးပါ။ ဒီမှာ တခြား ထည့်စရာ မရှိပါဘူး။

<DatePicker fx:id="dpDueDate" />

Controller ထဲမှာ (.java file):

Import line များ:

import javafx.fxml.FXML;
import javafx.scene.control.DatePicker;
import java.time.LocalDate;

Controller:

@FXML private DatePicker dpDueDate;

@FXML
private void handleSave() {
    LocalDate due = dpDueDate.getValue();      // null if nothing picked yet
    if (due == null) {
        // ask the user to choose a date, then stop
        return;
    }
    // your IA logic here: use the chosen date
    saveDueDate(due);
}

ကိုယ်ပိုင် logic ထည့်ရမယ့် နေရာ: // your IA logic here လို့ မှတ်ထားတဲ့ line ပါ၊ တကယ့် ရက်စွဲ တစ်ခု ရွေးပြီးမှ အဲဒီ line ကို run ပါတယ်။ null စစ်တာက wiring ပါ။

ကိုယ့် project နဲ့ ကိုက်အောင် ပြင်ပါ:

  • Date picker ကို ကိုယ့် field နဲ့ ကိုက်အောင် နာမည်ပြောင်းပါ။
  • getValue() က LocalDate တစ်ခု ပေးပါတယ်။ due.isBefore(...) ဒါမှမဟုတ် due.isAfter(...) နဲ့ ရက်စွဲတွေကို နှိုင်းယှဉ်နိုင်ပြီး စာသား လိုတဲ့အခါ DateTimeFormatter နဲ့ format (ပြမယ့် ပုံစံ) ချနိုင်ပါတယ်။

သတိထားရမယ့် အချက်များ:

  • dpDueDate ဆိုတဲ့ fx:id က @FXML field နာမည်နဲ့ အတိအကျ ကိုက်ရပါမယ်။ မကိုက်ရင် screen ကို load လုပ်လို့ ရပေမဲ့ field က null ဖြစ်နေပြီး handleSave run တဲ့အခါ error ဖြစ်ပါလိမ့်မယ်။
  • User က ရက်စွဲ တကယ် မရွေးမချင်း picker က null ကို return လုပ်ပါတယ်၊ ဒါကြောင့် တန်ဖိုးကို မသုံးခင် မရွေးရသေးတဲ့ အခြေအနေကို အမြဲ ကိုင်တွယ်ပါ။
  • LocalDate က နေ့တစ်နေ့ထဲက အချိန် မပါဘဲ ရက်စွဲကိုပဲ သိမ်းပါတယ်။ အချိန်ပါ လိုရင် DatePicker က အချိန် မယူတာကြောင့် သီးခြား field တစ်ခု လိုပါတယ်။

တွဲသုံးလို့ရတဲ့ recipe များ: Catch and explain bad input (မှားတဲ့ input ကို ဖမ်းပြီး ရှင်းပြခြင်း)၊ Save and load text (စာသားကို save လုပ်ခြင်းနဲ့ load လုပ်ခြင်း)။


Field ထဲမှာ ဂဏန်းကိုပဲ ခွင့်ပြုခြင်း

ဒါက ဘာလုပ်ပေးလဲ: text field ထဲကို ဂဏန်း မဟုတ်တဲ့ character (စာလုံး ဒါမှမဟုတ် သင်္ကေတ) တွေ ရိုက်ထည့်လို့ မရအောင် တားပေးပါတယ်၊ ဒါကြောင့် တန်ဖိုးက အမြဲ သန့်ရှင်းတဲ့ ဂဏန်း ဖြစ်နေပါတယ်။

IA မှာ ဘယ်အချိန် သုံးမလဲ: စာလုံးတွေ၊ သင်္ကေတတွေ ပါလာရင် နောက်ပိုင်းမှာ error ပဲ ဖြစ်စေမယ့် အရေအတွက်၊ အသက်၊ ဈေးနှုန်း ဒါမှမဟုတ် အမှတ် field မျိုးပါ။

SceneBuilder ထဲမှာ (layout): TextField (စာ တစ်ကြောင်း ရိုက်ထည့်တဲ့ box) တစ်ခု ထည့်ပြီး txtAge ဆိုတဲ့ fx:id ပေးပါ။ ဂဏန်း မဟုတ်တာတွေကို တားတဲ့ filter (လက်ခံမလား ပယ်မလား စစ်ပေးတဲ့ code) ကို code ထဲမှာ ချိတ်ပါတယ်။

<TextField fx:id="txtAge" />

Controller ထဲမှာ (.java file):

Import line များ:

import javafx.fxml.FXML;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;

Controller:

@FXML private TextField txtAge;

@FXML
public void initialize() {
    txtAge.setTextFormatter(new TextFormatter<>(change -> {
        if (change.getControlNewText().matches("\\d*")) {
            return change;       // accept: the new text is digits only (or empty)
        }
        return null;             // reject the change, so the character never appears
    }));
}

ကိုယ်ပိုင် logic ထည့်ရမယ့် နေရာ: ဒီ recipe က wiring သက်သက်ပါ၊ field ကို သန့်ရှင်းအောင် ထားပေးရုံပါပဲ။ ကိုယ်ပိုင် logic ကတော့ နောက်မှ field ကို ဖတ်တဲ့ နေရာ (ဥပမာ Integer.parseInt နဲ့) မှာ ရှိပါတယ်၊ အဲဒါက Catch and explain bad input (မှားတဲ့ input ကို ဖမ်းပြီး ရှင်းပြခြင်း) recipe ပါ။

ကိုယ့် project နဲ့ ကိုက်အောင် ပြင်ပါ:

  • \\d* ဆိုတဲ့ pattern (regular expression၊ စာသား ပုံစံကို ဖော်ပြတဲ့ သင်္ကေတ စနစ်) က “ဂဏန်း 0 လုံး ဒါမှမဟုတ် ဒီထက် ပိုများ” လို့ ဆိုလိုပါတယ်။ ဒသမ ကိန်း field အတွက် အစက် တစ်စက်ကိုလည်း ခွင့်ပြုဖို့ \\d*\\.?\\d* ကို သုံးပါ။
  • ဂဏန်းပဲ ဖြစ်ရမယ့် field တိုင်းမှာ ဒီလို formatter (TextFormatter၊ ရိုက်ထည့်တာကို စစ်ပြီး လက်ခံ ဒါမှမဟုတ် ပယ်ချပေးတဲ့ object) တစ်ခုကို ချိတ်ပါ။

သတိထားရမယ့် အချက်များ:

  • txtAge ဆိုတဲ့ fx:id က @FXML field နာမည်နဲ့ အတိအကျ ကိုက်ရပါမယ်၊ မဟုတ်ရင် screen ကို load လုပ်လို့ မရပါဘူး။
  • ဒီ snippet (code အပိုင်းအစ) က lambda (နာမည် မပါတဲ့ method တစ်ခုကို အတိုချုပ် ရေးတဲ့ နည်း၊ ဒီမှာ change -> { ... } အပိုင်း) နဲ့ TextFormatter ပေါ်က type parameter တစ်ခုကို သုံးပါတယ်။ နှစ်ခုလုံးက စာမေးပွဲ ပုံစံ Java (IB စာမေးပွဲ မေးခွန်းတွေမှာ သုံးတဲ့ Java အပိုင်း) အပြင်ဘက်မှာ ရှိလို့ စာမေးပွဲမှာ မေးနိုင်တဲ့ အကြောင်းအရာလို့ မယူဆပါနဲ့။ ဒါတွေက JavaFX မှာ ရိုက်ထည့်တာကို စစ်ထုတ်ဖို့ ပုံမှန် နည်းလမ်းပါ။
  • ဒါက မှားတဲ့ character တွေကို keyboard ကနေ ရိုက်ထည့်ကတည်းက တားပေမဲ့ field အလွတ်ကလည်း ဂဏန်း မဟုတ်သေးတာကြောင့် try/catch (error ဖြစ်ရင် ဖမ်းပြီး ကိုင်တွယ်တဲ့ ပုံစံ) ထဲမှာ Integer.parseInt နဲ့ ပြောင်းဖို့ လိုပါသေးတယ်။ Catch and explain bad input (မှားတဲ့ input ကို ဖမ်းပြီး ရှင်းပြခြင်း) နဲ့ တွဲသုံးပါ။

တွဲသုံးလို့ရတဲ့ recipe များ: Catch and explain bad input (မှားတဲ့ input ကို ဖမ်းပြီး ရှင်းပြခြင်း)၊ Show progress toward a goal (ပန်းတိုင်ဆီ ဘယ်လောက် ရောက်ပြီလဲ ပြခြင်း)။