Как получить доступ к элементам в JMenu и работать с Action Listener? - PullRequest
0 голосов
/ 26 октября 2018

Я столкнулся с проблемой с моим Java-кодом, когда слушатель действия не работает. Я должен создать графический интерфейс с панелью меню, которая выполняет некоторые действия при нажатии этих кнопок. Например, если пользователь выбирает опцию в меню «Питание» и опцию в меню «Общежития», он должен рассчитать значения, назначенные каждому из этих предметов, и затем вывести их в общую стоимость JField.

enter image description here

enter image description here

Вот так выглядит мой код

private class MenuActionListener implements ActionListener {

//The user has chosen a new dorm or new meal plan
//Get the choices from the dormBox and mealBox and recalculate charges
//Display the new charges in the totalField

  public void actionPerformed(ActionEvent arg0) {
    //Get the choices from the dormBox and mealBox
    int totalCost;
    int dormIndex = menu.getComponentCount();
    int dormCost=dormCosts[dormIndex];
    int mealIndex=dorm.getComponentCount();
    int mealCost=mealCosts[mealIndex];
    //Calculate the charges
    totalCost=dormCost+mealCost;

    //Display the new charges 
    totalField.setText("$"+Integer.toString(totalCost));
  }
}

Как мне заставить это работать хорошо ..?

Ответы [ 2 ]

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

Не пишите слушателей, которые пытаются угадать правильные значения для использования.Когда вы регистрируете прослушиватель для определенного компонента, вы уже знаете, какой это компонент, поэтому вы можете зарегистрировать прослушиватель, который делает правильные действия именно для этого компонента.

В этом случае, когда затраты хранятся вмассив, также должен быть соответствующий массив, используемый для построения пунктов меню, который позволяет создавать элементы и соответствующие слушатели.

Например,

static String[] dorms  = { "Allen Hall", "Pike Hall", "Farthing Hall" };
static int[] dormCosts = {           10,          20,              40 };
static String[] meals  = { "7 / weak", "14 / week", "unlimited" };
static int[] mealCosts = {          5,           8,          15 };
JTextField totalField = new JTextField();
int dormCost = dormCosts[0];
int mealCost = mealCosts[0];

void updateTotalCosts() {
    int totalCost = dormCost + mealCost; // really plus not multiply?
    totalField.setText("$" + totalCost);
}

JMenuBar buildMenu() {
    final JMenuBar mb = new JMenuBar();
    JMenu menu = mb.add(new JMenu("Meals"));
    for(int ix = 0; ix < meals.length; ix++) {
        int currMealCosts = mealCosts[ix];
        menu.add(meals[ix]).addActionListener(ev -> {
            mealCost = currMealCosts;
            updateTotalCosts();
        });
    }
    menu = mb.add(new JMenu("Dorms"));
    for(int ix = 0; ix < dorms.length; ix++) {
        int currDormCosts = dormCosts[ix];
        menu.add(dorms[ix]).addActionListener(ev -> {
            dormCost = currDormCosts;
            updateTotalCosts();
        });
    }
    return mb;
}

В каждой итерации цикла мы уже знаем, какой элементмы создаем и какие затраты связаны с ним, поэтому мы регистрируем слушателя, используя именно эти затраты.

Если вы не можете использовать лямбда-выражения, вариант метода построения до Java 8 будет выглядеть так

JMenuBar buildMenu() {
    final JMenuBar mb = new JMenuBar();
    JMenu menu = mb.add(new JMenu("Meals"));
    for(int ix = 0; ix < meals.length; ix++) {
        final int currMealCosts = mealCosts[ix];
        menu.add(meals[ix]).addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ev) {
                mealCost = currMealCosts;
                updateTotalCosts();
            }
        });
    }
    menu = mb.add(new JMenu("Dorms"));
    for(int ix = 0; ix < dorms.length; ix++) {
        final int currDormCosts = dormCosts[ix];
        menu.add(dorms[ix]).addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ev) {
                dormCost = currDormCosts;
                updateTotalCosts();
            }
        });
    }
    return mb;
}
0 голосов
/ 26 октября 2018

Боюсь, что этот подход не сработает.Вы не можете получить доступ к своим компонентам пользовательского интерфейса из ActionListener.

Возможно, вы захотите попытаться добавить анонимного слушателя в ваши JMenuItems, который обновляет атрибуты вашего класса для выполнения вычислений.

Редактировать : Проверьте ответ Хольгера для хорошего решения:)

Таким образом, вы можете получить доступ к внешним компонентам или лучше делегировать это классу модели.Смотрите здесь: https://www.codejava.net/java-core/the-java-language/java-8-lambda-listener-example

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...