Java FX Scene Builder: обработка нескольких событий mouseClick () из разных исходных объектов - PullRequest
0 голосов
/ 20 октября 2018

Я новичок в java FX и особенно новичок в построителе сцен.У меня есть небольшое приложение, которое рассчитывает оценки на основе веса.Я добавил к нему строку меню, но Scene Builder позволит мне только привязать mouseClick() к событию.Проблема в том, что у меня уже есть кнопка расчета (которая рассчитывает оценку), связанная с этим событием.Я бы хотел, чтобы мой MenuItem открыл диалоговое окно, которое я создал при нажатии.

Вот моя текущая попытка заставить метод работать:

@FXML
    public void mouseClick(MouseEvent mouseEvent)
    {
        if (mouseEvent.getSource().equals(calcBtn))
        {
            DecimalFormat df = new DecimalFormat("#.##");
            double result = calcGrade();
            resultLbl.setText("Overall Grade: " + df.format(result) + "%");
        }
        if (mouseEvent.getSource().equals(aboutMenu))
        {
            DialogBox.showInformation("About", "Some dialog here.");
        }
    }

В Swing я помню, как делал такие вещи для обработки нескольких исходных объектов:

if (e.getSource() == menuItem)
{
    //do stuff
}
else if (e.getSource() == calculateBtn)
{
    //calculate stuff 
}

Однако это не работает, и код для кнопки вычисления выполняется независимо.

Из-за способа, которым Scene Builder связывает действия с классом Controller, я не уверен, как разделить действия между этими двумя различными источниками, когдакнопка мыши нажата.Когда я пытаюсь привязать обычай к событию, строитель сцен кричит на меня и разрешает только mouseClick().Что было бы хорошим решением для обработки такого типа ситуации?

1 Ответ

0 голосов
/ 20 октября 2018

Я рекомендую использовать разные методы обработчика для обоих событий.Кроме того, следует использовать обработчики событий onAction (MenuItem s не являются Node s, поэтому не могут быть источниками MouseEvent s):

<MenuItem text="Do Something" onAction="#doSomething" />
...
<Button text="Do something else" onAction="#doSomethingElse" />
@FXML
private void doSomething() {
    System.out.println("Menu Item clicked");
}

@FXML
private void doSomethingElse() {
    System.out.println("Button clicked");
}

Таким способом легче поддерживатькод.(Представьте, что вам нужно изменить реализацию действия для одного из пунктов меню, и вы обрабатываете 30 из них одним и тем же методом; сколько времени вам потребуется, чтобы найти правильную часть вашего if / else if. Большинство IDE поддерживают навигациюк методу.)


Если вы хотите придерживаться проверки источника, у вас все будет в порядке, пока тип события назначается параметру метода:

<MenuItem fx:id="menuItem" text="Do Something" onAction="#doSomething" />
...
<Button fx:id="button" text="Do something else" onAction="#doSomething" />
@FXML Button button;
@FXML MenuItem menuItem;

@FXML
private void doSomething(ActionEvent event) {
    Object source = event.getSource();
    if (button == source) {
        System.out.println("button clicked");
    } else if (menuItem == source) {
        System.out.println("menu item clicked");
    }
}

Вам может потребоваться изменить тип параметра метода на Event, если вы хотите обрабатывать MouseEvent s и ActionEvent s, используя тот же метод.

...