2016-12-07 1 views
0

Используя JavaFX и Scene Builder, я пытаюсь получить доступ к тексту внутри метки с контроллера.Получить fx: 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 Я нашел это, но я не думаю, что этот ответ работает для меня, потому что инициализация метки и установка идентификатора, похоже, не справляются с @FXML. Кроме того, на него не было ответа, можно ли получить доступ к идентификатору fx: id компонента.

Любые другие способы доступа к методам объекта Label, такие как getText(), также приветствуются.

+1

'((Ярлык) event.getSource()). GetText()'? (Даже если вы можете получить 'fx: id', чего вы не можете, как бы вы использовали это для вызова 'getText()' ??) –

+0

Идея заключалась в том, чтобы делать label1.getText(). Поскольку fx: id - label1, я думал, что могу использовать имя id .getText(). Но ваш путь тоже работает. Но ответ заключается в том, что вы не можете получить доступ к fx: id, но должны найти способ обойти его. Благодаря! – sandboxj

+1

Но у вас не было бы 'label1' (это ссылка на объект): у вас будет переменная' String', содержащая текст '' label1 "', что совсем не то же самое. Что бы вы тогда сделали? –

ответ

4

Это не совсем понятно, что вы сделали бы с fx:id, если бы вы могли его получить. Это просто имя переменной, которая ссылается на Label, поэтому она не является частью самого Label. Даже если бы вы получили имя, которое предположительно было бы строкой, что бы вы сделали?

Вы можете получить ссылку на источник события с event.getSource(), и если у вас есть только зарегистрирован этот метод в качестве обработчика для Label с, то вы можете обратное приведение его к 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 (или, по крайней мере, на части пользовательского интерфейса, который имеет все эти метки). Тогда вы можете зарегистрировать другой обработчик для каждого из них, не повторяя код:

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 меток (даже без решения обработчиков событий на всех), это довольно ясно, что использование Java для пользовательского интерфейса, подобного этому, немного проще, чем использование FXML. И, конечно же, вы можете создать подкласс VBox, который сделал то же самое, и просто ссылаться на этот класс из файла FXML, если вы хотите, чтобы остальные в FXML.

Смежные вопросы