Внутренняя переменная передачи кадра назад Java

Как новичок, я борюсь с этой основной проблемой. У меня есть внутренняя рамка, которая открывается с помощью простой кнопки на моей основной рамке.

Я хотел бы иметь возможность получить значение одной переменной из моего внутреннего фрейма и использовать его для расчетов в моем основном фрейме.

ВНУТРЕННЯЯ РАМА:

private void jSlider1StateChanged(javax.swing.event.ChangeEvent evt) {                                      
int x = jSlider1.getValue();
}

который отлично работает

ОСНОВНАЯ РАМКА:

int x = INTERNAL_FRAME.x;  //ERROR: Cannot find variable

int x = INTERNAL_FRAME.jSlider1.getValue(); //ERROR: jslider has private access

Как я могу передать х моей главной раме?

Я пробовал следующее:

Внутренняя рамка // действие выполнено

new MAIN_FRAME(x);

MAIN_FRAME

public MAIN_FRAME(x){
double var = x;
initComponents();
}

заранее спасибо

1 ответ

Есть несколько решений:

Передайте ссылку mainFrame на внутренний кадр и вызовите метод основного кадра из внутреннего кадра при изменении состояния ползунка. Это соединяет внутреннюю рамку с главной рамой, хотя

public class MainFrame {
    public void doSomethingWithX(int x) {
        // ...
    }

    public void showInternalFrame() {
        InternalFrame f = new InternalFrame(this);
        // ...
    }
}

public class InternalFrame {
    private MainFrame mainFrame;

    public InternalFrame(MainFrame mainFrame) {
        this.mainFrame = mainFrame;
    }

    private void jSlider1StateChanged(ChangeEvent evt) {
        int x = jSlider1.getValue();
        mainFrame.doSomethingWithX();
    }
}

Или передайте ссылку на некоторый интерфейс (например, XValueChangeListener) из основного кадра во внутренний кадр и вызовите метод xValueChanged() из внутреннего кадра при изменении x. Это отделяет внутреннюю рамку от основной рамки.

public interface XValueChangeListener {
    void xValueChanged(int newValueOfX);
}

public class MainFrame {
    private void doSomethingWithX(int x) {
        // ...
    }

    public void showInternalFrame() {
        InternalFrame f = new InternalFrame(new XValueChangeListener() {
            @Override
            public void xValueChanged(int newValueOfX) {
                doSomethingWithX(x);
            }
        });
        // ...
    }
}

public class InternalFrame {
    private XValueChangeListener listener;

    public InternalFrame(XValueChangeListener listener) {
        this.listener = listener;
    }

    private void jSlider1StateChanged(ChangeEvent evt) {
        int x = jSlider1.getValue();
        listener.xValueChanged(x);
    }
}

Вы можете использовать последнее решение со стандартными событиями Java, если хотите (например, ChangeListener или PropertyChangeListener).

Другие вопросы по тегам