2013-05-17 5 views
0

Как новичок, я борюсь с этой основной проблемой. У меня есть внутренний фрейм, который открывается с помощью простой кнопки на моем основном фрейме.Внутренняя рамка проходная переменная назад 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).