0

嗨,我正在用 Java 做应用程序来控制一些带有 RS232 端口的机械设备。

该代码正在运行;)但是它非常大而且很混乱,所以我试图让它更接近设计模式并且更容易实现新事物,所以我开始使用来自 Apache Fundation 的“commons SCXML”状态机代码来控制应用程序的行为,因为那里有很多状态可能会发生,例如传输失败等。

有 3 种状态:idle、connection_attempt 和 connected。

有 4 个事件:try_to_connect、connection_attempt_success、connection_attempt_failed、try_to_disconnect

有一个带有 main 方法的 Knapx 类,它创建了两个对象:“KnapxInterface”对象——它包含 gui 的东西,比如带有 RS232 波特率设置和 comport 名称的组合框和“StateMachine”对象——它包含“fireEvent”方法和特定状态执行代码。

Knapx 类:

public class Knapx 
{
    public static void main(String[] args) {

        StatusFSM StateMachine= new StatusFSM();

        EventQueue.invokeLater(() -> 
        {
            Gui KnapxInterface = new Gui(StateMachine);
            KnapxInterface.setVisible(true);
        });
    }   
}

在“Gui”类中,有一个类构造函数,它接受一个参数:“链接”到触发状态机事件所需的状态机对象

public class Gui extends JFrame 
{
    public Gui(StatusFSM machine) 
    {

        //(...) some things unrelated to the question

        State_machine_engine = machine;
    }

    ButtonConnect.addActionListener(event -> ConnectComPort());

    // (...)

    private void ConnectComPort()
    {
         State_machine_engine.fireEvent("try_to_connect");
    }

}

它有效:单击连接按钮触发“try_to_connect”事件,将状态机的状态更改为“connection_attempt”,但现在有我的问题:在 StatusFSM 类中有方法:

public void connection_attempt()
{
    System.out.println("STATE: connection_attempt");
}

它在状态机进入 connection_attempt 状态时执行,我想让它从“Gui”类调用“getRs232Setting”方法:

public SerialSettings getRs232Settings()
{
    Rs232Settings.PortName = (String)ComPortListJComboBox.getSelectedItem();
    Rs232Settings.BaudRate = Integer.parseInt((String)BaudRateJComboBox.getSelectedItem());
    return Rs232Settings;
}

但是怎么办?!我无法从基于“Gui”类的“KnapxInterface”对象中触发方法,而我在基于“StatusFSM”类的“StateMachine”对象中没有创建一些“链接” - 我是 Java 初学者,所以我会尝试发送“链接”以这种方式使用 StatusFSM 类构造函数:

public class Knapx 
{
    public static void main(String[] args) {

        StatusFSM StateMachine= new StatusFSM(KnapxInterface);

        EventQueue.invokeLater(() -> 
        {
            Gui KnapxInterface = new Gui(StateMachine);
            KnapxInterface.setVisible(true);
        });
    }   
}

但是当我创建 StateMachine 对象时,还没有活动的 KnapxInterface 对象,所以它不是正确的方法。

请让我知道如何处理这样的问题 - 我知道它一定是一个简单但功能强大的解决方案,但我不知道如何命名我的问题,所以我可以在我办公桌上的 Cay Horstmann - Java 等书籍中找到它。

谢谢

4

1 回答 1

0

答案很简单,但如果涉及到良好的实践,它可能不是最好的。我做了额外的方法

public class Alpha ()
{
Beta BetaLink;    
public void GetLink(Beta link)
{
BetaLink = link;
}
}

public class Beta()
{
Alpha AlphaLink;    
public void GetLink(Alpha link)
{
AlphaLink = link;
}
}

//last class - which puts together everything
public class Charlie()
{
Alpha AlphaObject = new Alpha();
Beta BetaObject = new Beta();
Alpha.GetLink(Beta);
Beta.GetLink(Alpha);
}
于 2018-07-08T15:42:46.687 回答