内部框架传递变量返回java

时间:2013-05-17 15:08:13

标签: java swing jframe parameter-passing jinternalframe

作为一个新手,我在努力解决这个基本问题。 我有一个内部框架,使用我主框架上的一个简单按钮打开。

我希望能够从我的内部框架中获取一个变量的值,并将其用于我的主框架上的计算。

内部框架:

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

如何将x传递给我的主框架?

我尝试了以下内容:

内部框架//已执行的行动

new MAIN_FRAME(x);

MAIN_FRAME

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

提前致谢

1 个答案:

答案 0 :(得分: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)的引用,并在x更改时从内部框架调用xValueChanged()方法。这将内部框架与主框架分离。

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)。