Внутренняя переменная передачи кадра назад 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).