Привет Я использую приложение в Java для управления некоторым механическим устройством с портом RS232.
Код работает;) но он очень большой и беспорядочный, поэтому я стараюсь сделать его ближе к дизайну paterns и проще реализовать новые вещи, поэтому я начал использовать код конечного автомата «commons SCXML» из Apache Fundation для управления поведением приложений, поскольку там так много состояний, которые могут возникать как ошибки передачи и другие.
Существует 3 состояния: idle, connection_attempt и связанные.
Существует 4 события: try_to_connect, connection_attempt_success, connection_attempt_failed, try_to_disconnect
Существует класс 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, и я хочу заставить его вызвать метод getRs232Setting из класса «Gui»:
public SerialSettings getRs232Settings()
{
Rs232Settings.PortName = (String)ComPortListJComboBox.getSelectedItem();
Rs232Settings.BaudRate = Integer.parseInt((String)BaudRateJComboBox.getSelectedItem());
return Rs232Settings;
}
Но как?! Я не могу использовать метод огня из объекта «KnapxInterface» на основе класса «Gui», в то время как я нахожусь в объекте «StateMachine» на основе класса «StatusFSM», не создавая некоторую «ссылку» - я начинаю на 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, поэтому он не является правильным.
Пожалуйста, дайте мне знать, как справиться с такой проблемой. Я знаю, что это простой, но мощный Soluton, но я не знаю, как назвать свою проблему, чтобы найти ее в таких книгах, как Cay Horstmann - Java, которая лежит на моем столе.
благодаря