2016-05-16 45 views
-1

現在我正在研究樹莓派,並且我在java,javafx platforms中編寫了一些程序。我只是想告訴你,我只是javafx的初學者。如何在Javafx中自動觸發輸入鍵

根據我只想在更改我的textfield後觸發ENTER鍵。我的程序的工作原理是這樣的;

1)我已經創建了一個masterform fxml,它將所有其他頁面定向到一個文本框。

2)我創建的主要方法,讓我用鍵盤輸入一些特定的字符串值,將它們分配給文本字段進行頁面變更。我有一個橋接Java頁面,它包含全局變量,以便在項目中隨處使用。因此,首先我將鍵值設置爲這些全局變量。這些全局變量創建爲stringproperty,用於爲任何更改添加actionlistener。

4)然後我將這些全局變量設置爲文本字段。

5)Textfield指示來自鍵盤的相關值。但不幸的是我不能轉發頁面而沒有按下輸入鍵。在這種情況下我想觸發這個textfield。但不幸的是我不知道如何觸發texfield而不按下輸入密鑰。因此,我決定讓自動觸發器爲該文本字段輸入密鑰。

我只是用機器人方法;

Robot robot = new Robot(); 
robot.keyPress(KeyEvent.VK_ENTER); 

但它並沒有經過工作。因爲我設置的全局變量文本框的第一time.It沒有定義文本字段的值是按回車鍵後changed.It決定。

因此,如何在獲取全局變量的值後觸發此文本字段。我想通過如何設置頁面,我會告訴你我的程序是如何工作的。

我的代碼的例子是;

主要方法

public static void main(String[] args) { 
Scanner scanner=new Scanner(System.in); 

     for (String strBarcode = scanner.nextLine(); !strBarcode.isEmpty(); 
       strBarcode = scanner.nextLine()) { 

      if (strBarcode.equals("distribution")){ 

      Global.G_MOD.set("distribution"); 
      System.out.println(Global.G_MOD.get()); 

     } 
}} 

GlobalVariables.java(橋頁)

public class Global{ 
public static StringProperty G_MOD = new SimpleStringProperty(""); 
} 

我MasterController頁爲JavaFX

public class masterformController implements Initializable { 


@FXML 
    public TextField tbxBarcode; 

@FXML 
    void onchangetbxBarcode(ActionEvent event) { 

if(Global.G_MOD.get().equals("distribution")){ 

     try { 
FXMLLoader loader = new FXMLLoader(getClass().getResource("/puttolightfx/fxml/page1.fxml")); 
      Parent rootpage1 = (Parent)loader.load(); 

      pnPages.getChildren().clear(); 
      pnPages.getChildren().add(rootpage1);  


     } catch (IOException ex) { 
      Logger.getLogger(masterformController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
} 

@Override 
    public void initialize(URL url, ResourceBundle rb) { 

Global.G_MOD.addListener(new ChangeListener(){ 
     @Override 
      public void changed(ObservableValue observable, Object oldValue, Object newValue) { 
       String Newvalue = (String)newValue; 
       tbxBarcode.setText(Global.G_MOD.get());} 
     }); 

} 


} 

所以一切工作,只是我有觸發文本框當全局值:Global.G_MOD將顯示在texfield上。然後它會根據全局值Global.G_MOD傳遞到另一個頁面:「distribution」

SOLUTION(解決):

我解決了使用上的textfield.I的監聽線程我的問題放棄了觸發自動進入關鍵,側重於文本框的變化。

我只是決定使用線程來更改文本字段監聽器中的.fxml頁面。

Platform.runLater(new Runnable() { 
    @Override 
    public void run() { 
     //if you change the UI, do it here ! 
    } 
}); 

編輯的代碼:

tbxBarcode.textProperty().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> { 
      String Newvalue=(String)newValue; 
      System.out.println(tbxBarcode.getText()); 
      Platform.runLater(new Runnable() { 
    @Override 
    public void run() { 
          if(Global.G_MOD.get().equals("distribution")){ 

     try { 
FXMLLoader loader = new FXMLLoader(getClass().getResource("/puttolightfx/fxml/page1.fxml")); 
      Parent rootpage1 = (Parent)loader.load(); 

      pnPages.getChildren().clear(); 
      pnPages.getChildren().add(rootpage1);  


     } catch (IOException ex) { 
      Logger.getLogger(masterformController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
} 
//    } 


    } 
}); 
     }); 

回答

0

嘗試使用

textField.fireEvent(new KeyEvent(KeyEvent.KEY_PRESSED, "", "", KeyCode.ENTER, true, true, true, true)); 

按照文檔

public KeyEvent(EventType<KeyEvent> eventType, 
       String character, 
       String text, 
       KeyCode code, 
       boolean shiftDown, 
       boolean controlDown, 
       boolean altDown, 
       boolean metaDown) 
Constructs new KeyEvent event with null source and target and KeyCode object directly specified. 
Parameters: 
eventType - The type of the event. 
character - The character or sequence of characters associated with the event 
text - A String describing the key code 
code - The integer key code 
shiftDown - true if shift modifier was pressed. 
controlDown - true if control modifier was pressed. 
altDown - true if alt modifier was pressed. 
metaDown - true if meta modifier was pressed. 
Since: 
JavaFX 8.0 

你可以參考https://docs.oracle.com/javase/8/javafx/api/javafx/scene/input/KeyEvent.html

編輯1 您需要確定必須觸發Enter鍵事件的時刻。 例如: 如果你的文本框允許有限的字符數,那麼你可以通過以下方式添加上述代碼:

txtField.textProperty().addListener(new ChangeListener<String>() { 

      @Override 
      public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 

       if (newValue.length()>30) { 
        txtField.setText(oldValue); 
        txtField.fireEvent(new KeyEvent(KeyEvent.KEY_PRESSED, "", "", KeyCode.ENTER, true, true, true, true)); 
       } 
      } 
     }); 

這僅僅是一個例子。它可以多次觸發你的事件,所以你需要編寫代碼來激發事件一次。

+0

你是什麼意思與「robot.fireEvent」。我應該定義而不是這個?沒有名爲「fireEvent」的方法應該使用什麼來代替這個。 – Xspacex

+0

'fireEvent()'是所有javafx控件的內置方法。對不起提及機器人。我編輯了我的答案。將此方法應用於您的'TextField'或您想要自動觸發事件的任何其他控件。 –

+0

我認爲它會很好的工作。我只是嘗試過,但在這一行發生了另一個錯誤:** tbxBarcode.fireEvent(new KeyEtbxBarcodevent(KeyEvent.KEY_PRESSED,「」,「」,KeyCode.ENTER,true,true,true, true)); **和錯誤:**不兼容的類型; int不能轉換爲組件**但我不知道哪個值是「int」 – Xspacex

相關問題