Как получить доступ к уже запущенному экземпляру класса без создания фактического объекта

У меня проблема с графическим интерфейсом Java. Это трудно объяснить, но я сделаю все, что в моих силах. У меня есть 2 класса графического интерфейса: один - класс I, а другой - класс G. Класс I инициируется из основного метода. В классе I есть поле (экземпляр) класса G. Причина в том, что класс I собирает важную информацию и передает ее экземпляру класса G. Когда кнопка нажата в классе I, это устанавливает видимость кадра класса I на false и экземпляр класса G в true (отображение интерфейса G). Проблема здесь в том, что я хочу иметь возможность сделать прослушиватель в G, который устанавливает видимость I обратно в true, таким образом отображая ранее отредактированное окно. У меня было решение избавиться от всех фреймов и создать новый экземпляр, но это показывает только новый очищенный экземпляр I. Вот несколько фрагментов кода:

Класс I:

Поля:

private JFileChooser j;
private FileFilter filter;
private GUI g;  //<--- it is initialized shortly after.
private Font masterFont;
private JFrame frame;
private JButton done;

private JButton browse1;
private JButton browse2;.....

Делает G видимым, а I невидимым:

class Done implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {

        for (int i = 0; i < 9; i++) {
            System.out.println(array[i]);
        }

        g.setArray(array);
        System.out.println(array);
        setText();
        frame.setVisible(false);
        g.setVisible(true);
        g.setVisible2(false);
        if (g.clear.isSelected()) {
            frame.setVisible(true);
        }


    }

Класс G: обратите внимание, здесь я не могу создать экземпляр I, потому что постоянно получаю сообщение об ошибке переполнения стека.

Hard Reset: этот просто создает новый экземпляр при удалении остальных (возможно, расточительно, потому что старый экземпляр I не закрыт должным образом)

private class Reset implements ActionListener {
    @Override
        public void actionPerformed(ActionEvent arg0) {
            frame.dispose();
            frame2.dispose();

            Runnable runnable = new Runnable() {
                @Override
            public void run() {
                Intro g = new Intro();
                g.setVisible(true);

            }
        };
        EventQueue.invokeLater(runnable);
    }
}

Я хочу иметь доступ к «уже работающему» экземпляру I без создания новых.


person pirate694    schedule 07.04.2013    source источник
comment
взгляните на статическое ключевое слово;)   -  person Hiro2k    schedule 07.04.2013
comment
Передайте this в методе установки другому классу. Что бы вы ни делали, не используйте static, как рекомендует @Hiro2k.   -  person Hovercraft Full Of Eels    schedule 07.04.2013
comment
ИДЕАЛЬНО!!! Большое спасибо. Я не совсем понимал, что на самом деле означало или делало это ключевое слово, но теперь я понимаю. Проблема решена!   -  person pirate694    schedule 07.04.2013


Ответы (3)


Вы можете получить текущее окно верхнего уровня из объекта ActionEvent, который передается в метод actionPerformed вашего ActionListener. Получите исходный объект, вызвавший вызов прослушивателя через getSource(), а затем вызовите SwingUtilities.getWindowAncestor() в источнике, чтобы получить окно (JFrame, JDialog или что-то еще).

person Hovercraft Full Of Eels    schedule 07.04.2013

Вы можете передать ссылку на «I» в «G» (через конструктор или сеттер) и использовать ее в actionPerformed, чтобы установить видимость в true. Если у вас есть только один экземпляр «I», другой подход - создать статическую ссылку на него, на которую вы можете ссылаться из «G».

person pmorken    schedule 07.04.2013

Одним из решений было бы, чтобы класс G содержал ссылку на I.

public class G
{
    private I i;
    // ... other stuff

    public G(I i)
    {
        this.i = i;
    }
}

И при необходимости скрыть себя и показать окно графического интерфейса "I" (или что-то еще). Я бы выбрал это решение, если класс «I» является родителем (владеет) «G» (что, похоже, имеет место в опубликованном вами коде). Вы тот, кто может лучше всего определить, так ли это, но простой пример: если у вас есть главное окно и какое-то диалоговое окно (которое в этом случае будет действовать как дочернее). Если они оба являются равноправными гражданами (оба принадлежат какому-то третьему классу), я бы вместо этого передал ссылку на этот класс и заставил его управлять, когда «I» и «G» отображаются или скрываются.

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

person Emma Gospodinova    schedule 07.04.2013