2016-12-07 55 views
0

使用JavaFX和場景生成器,我想從控制器訪問標籤內的文本得到它的文本。獲取外匯:從標籤ID點擊從控制器

我初始化的標籤爲控制器如下:

@FXML 
private Label label1; 

以下代碼是在FXML文件:

<Label fx:id="lable1" onMouseClicked="#handleLabel" text="Label 1" /> 

我已經在控制器中使用的場景結合的標籤,以該功能製造商:

private void handleLabel(MouseEvent event) { 
// get text from label n 
} 

我的想法是調用像label1.getText()。但爲此,我需要獲得標籤的fx:id,並且由於我會有很多標籤,因此我無法單獨硬編碼所有id個案。

Better way for Getting id of the clicked Object in JavaFX controller 我已經找到了這個,但我不認爲這個答案適用於我,因爲初始化標籤並設置一個id似乎並不符合@FXML。 此外,還沒有回答是否可以訪問組件的fx:id。

如何訪問標籤對象的方法,如getText()也歡迎任何其他方式。

+1

'((標籤)event.getSource())。gettext的()'? (即使你能拿'外匯:身份證',你不能,你會怎麼用它來調用'它的getText()'??) –

+0

當時的想法是做label1.getText()。由於fx:id是label1,我以爲我可以使用id .getText()的名稱。 但你的方式也適用。但答案是你無法訪問fx:id,但必須找到解決方法。謝謝! – sandboxj

+1

但是你不會有'label1'(這是一個對象的引用):你必須包含文本'「LABEL1」',這是不一樣的東西都一個'String'變量。那你會怎麼做? –

回答

4

它根本不清楚你將與fx:id做什麼,如果你能得到它。它只是引用Label的變量的名稱,所以它不是Label本身的一部分。即使你確實得到了這個名字,這可能是一個字符串,你會怎麼做?

你可以得到event.getSource()一個參考事件的來源,假設你有註冊此方法作爲處理程序Label S,那麼你可以把它向下轉換到一個Label

private void handleLabel(MouseEvent event) { 
    Label label = (Label) event.getSource(); 
    String labelText = label.getText(); 
    System.out.println("Mouse click on label: "+labelText); 
} 

通常,我發現爲每個控件擁有不同的處理程序要好得多,而不是使用像這樣檢查事件源的單個處理程序。很顯然,如果你使用FXML,這會變得非常重複(但是對於大量控件使用FXML已經是重複的)。用Java而不是FXML(或者至少包含所有這些標籤的UI部分)做這個可能會更好。然後,你可以不重複的代碼註冊爲每一個不同的處理程序:

VBox lotsOfLabels = new VBox(); 
for (int i = 1 ; i <= 100; i++) { 
    Label label = new Label("Label "+i); 
    lotsOfLabels.getChildren().add(label); 
    label.setOnMouseClicked(e -> { 
     System.out.println("Mouse click on "+label.getText()); 
     // etc... 
    }); 
} 

如果你比較該代碼的FXML創建100個標籤(甚至沒有處理的事件處理程序的話),這是很清楚,使用像這樣的UI的Java比使用FXML更簡單。當然,你可以創建一個VBox的子類來完成同樣的事情,如果你希望FXML中的其他類可以從FXML文件中引用該類。