2013-05-17 1 views
0

En tant que débutant, je me bats avec ce problème de base. J'ai un cadre interne qui s'ouvre en utilisant un simple bouton sur mon cadre principal.Variable de trame interne arrière back java

Je voudrais être en mesure d'obtenir la valeur d'une variable de mon cadre interne et l'utiliser pour les calculs sur mon image principale.

CADRE INTERNE:

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

qui fonctionne parfaitement bien.

CADRE PRINCIPAL:

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

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

Comment puis-je passer x à mon CARTER?

J'ai essayé ce qui suit:

CADRE INTERNE // Action réalisée

new MAIN_FRAME(x); 

MAIN_FRAME

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

Merci à l'avance

Répondre

1

Il existe plusieurs solutions:

Transmettez une référence mainFrame au cadre interne et appelez une méthode de l'image principale à partir de l'image interne lorsque l'état du curseur change. Ce couple le cadre interne au châssis principal si

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(); 
    } 
} 

Ou passer une référence à une interface (XValueChangeListener par exemple) du cadre principal au cadre interne, et appeler la méthode xValueChanged() du cadre interne lorsque x changements. Ceci dissocie le cadre interne du cadre principal.

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); 
    } 
} 

Vous pouvez utiliser la dernière solution avec des événements Java standard si vous voulez (comme ChangeListener ou PropertyChangeListener).