Библиотека jSerialComm и проблема потока пользовательского интерфейса с использованием JFrame. port.OpenPort(); метод блокирует поток пользовательского интерфейса и не допускает никаких обновлений во внешнем интерфейсе

#java #swing #serial-port #jframe #java-threads

Вопрос:

У меня есть задание на программное обеспечение для кодирования, чтобы считывать данные с последовательного порта и отображать их в интерфейсе. Я использовал JFrames для интерфейса и библиотеку JSerialcomm для операций чтения и записи, но при открытии последовательного порта путем вызова метода port.OpenPort(); пользовательский интерфейс блокируется, блокируется JLbel, который должен отображать входящие данные.

     public class mainscreen{

    JLabel jlabel;
    JFrame frame;

    public static void main(String[] args)
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                
                mainscreen window = new mainscreen();
                window.frame.setVisible(true);
                window.frame.setResizable(true);
                window.frame.setExtendedState(frame.MAXIMIZED_BOTH);
                
                ports = SerialPort.getCommPorts();
                for(int i=0;i<ports.length;i  ){
                    System.out.println(ports[i].getDescriptivePortName());
                }
                    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public menubar() {
    initialize();
}
 public void open_port(SerialPort selected_port) {
    selected_port.openPort();
    jlabel.setText("Port Open");
}
private void initialize() {
    frame = new JFrame();
    jlabel = new JLabel("Port Not Open");
    jlabel.setFont(new Font("Times New Roman", Font.BOLD, 18));
    jlabel.setBounds(819, 50, 150, 22);
    frame.getContentPane().add(jlabel);
 }
}
 

Здесь я использовал метод EventQueue.invokeLater и завершил разработку интерфейса.Существует второй экран, на котором пользователь выбирает порт и который вызовет метод open_port в классе главного экрана, но метка jl не обновляется. Я проверил, открыт ли порт с помощью метода isOpen (), и это было так. Но если я не вызову метод OpenPort и просто обновлю интерфейс с выбранным именем порта, он будет работать (jlabel показывает номер порта).

Пожалуйста, помогите мне с этой ошибкой, так как это становится огромным бременем. Любая помощь будет очень признательна.

Я просто хочу, чтобы ярлык пользовательского интерфейса обновлялся после открытия порта. Это какая-то проблема с потоком, которую я не могу решить.

Комментарии:

1. Я бы предположил, что этот код блокирует поток отправки событий , из — за чего графический интерфейс перестает отвечать на запросы.

2. Считайте информацию о последовательном порту в a java.util.List с помощью Swing Timer . Создайте графический интерфейс и загрузите List информацию в поток отправки событий . Учебник Oracle по созданию графического интерфейса с помощью Swing научит вас правильному способу создания графических интерфейсов Swing. Пропустите раздел Netbeans.