Правильное использование внутренних классов (как разделить класс в пользовательском событии) - PullRequest
0 голосов
/ 19 ноября 2011

Я пытаюсь запрограммировать Java-приложение, которое состоит из нескольких окон, используя JFrame.

Каждый JFrame содержит JTextField и кнопку для перехода к следующему JFrame.

Мне нужно получить всеинформация, введенная пользователем в конце.

Я создал событие, щелкнув по кнопке, чтобы сохранить в общедоступный класс все данные, которые пользователь вводит в JTextField.Я назвал этот открытый класс myData, который имеет статические атрибуты.

Проблема в том, что я не могу получить доступ к этому классу из функции прослушивателя кнопок.

Я получаю сообщение об ошибке: не могу сослаться на не финальную переменную внутри внутреннего класса, определенного в другом методе.

Моя цель - иметь возможность делить класс myData между различными методамидругой класс.

Например, у меня есть класс с именем myClass1 и myClass2, поэтому я хочу поделиться атрибутом myData между методами myClass1 и методами myClass2.

Пожалуйста, кто-нибудь может мне помочь?или предложите другой способ сделать это!

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 19 ноября 2011

Извините, но ваш дизайн требует много работы. Я собираюсь рекомендовать вам прочитать о MVC . может показаться, что жевать уже сейчас очень много, но в конечном итоге это вам очень поможет. На заметку: не вкладывайте определения классов данных и не забывайте всегда различать классов и объектов .

1 голос
/ 19 ноября 2011

Все вызовы о MVC и т. Д. Действительны, но это не так сложно.

То, что вы хотите сделать, находится в вашем Main, вы можете создать свой класс Data (Model), класс, который содержит всю вашу информацию.

Итак, вы можете сделать что-то вроде этого:

public class F1 ... {
    private final Data myData;

    public F1(Data theData) {
        myData = theData;
    }

    ....
}

public class Main {
    Data myData;

    public static void main(String args[]) {
        Main m = new Main();
        m.setMyData(new Data());

        F1 f = new F1(m.getMyData());
        ...
     }
}

Затем, позже, когда F1 вызывает F2, просто сделайте то же самое - создайте F2 с данными, переданными ранее конструктором. Таким образом, когда каждый фрейм работает, все они работают с одним и тем же экземпляром данных. Когда все будет сделано, единственный экземпляр Data останется в классе Main, чтобы вы могли делать то, что хотите.

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

Дополнения:

Есть несколько вещей, которые вы можете сделать.

Когда вы получаете ActionEvent, он содержит источник. Этот источник является компонентом, сгенерировавшим событие (скорее всего, Button в этом случае). Если вы знаете, где находится кнопка в иерархии вещей, вы попадаете в свой фрейм напрямую. В примере вставки у вас есть Frame -> Panel -> Button. Итак, если у вас есть кнопка, вы можете добраться до фрейма.

public void actionPerformed(ActionEvent e) {
    JButton sourceButton = (JButton)e.getSource();
    F1 f1 = (F1)sourceButton.getParent().getParent();
    Data myData = f1.getMyData();
    data.setField(...);
}

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

0 голосов
/ 19 ноября 2011

Ваш общий дизайн обмена JFrame мне кажется немного сомнительным.Почему бы вместо этого не использовать диалоги, такие как JDialog или JOptionPane, или даже лучше CardLayout для обмена представлениями.Также я призываю вас не использовать статические поля для всего этого, так как это может вызвать серьезные проблемы в будущем и сделать ваш код менее совместимым с хорошими объектно-ориентированными принципами.Что касается обмена информацией, то все, что я могу сказать, это то, что речь идет об одном классе, имеющем правильную ссылку на другой класс.Для получения более конкретного совета вам, вероятно, потребуется показать нам больше информации и кода.

Редактировать
Кроме того, вы, конечно, знаете, что вы можете получить ссылку на JButton, который стимулировалActionListener путем вызова getSource() объекта ActionEvent, переданного в метод actionPerformed.Это может позволить вам получить ссылку на класс, который содержит JButton при необходимости.

...