0

作为一个新手,我在这个基本问题上苦苦挣扎。我有一个内部框架,可以使用主框架上的一个简单按钮打开。

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

内部框架:

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 传递给我的 MAIN FRAME?

我尝试了以下方法:

内部框架//执行的操作

new MAIN_FRAME(x);

主帧

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

提前致谢

4

1 回答 1

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

于 2013-05-17T15:26:53.517 回答