#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
с помощью SwingTimer
. Создайте графический интерфейс и загрузитеList
информацию в поток отправки событий . Учебник Oracle по созданию графического интерфейса с помощью Swing научит вас правильному способу создания графических интерфейсов Swing. Пропустите раздел Netbeans.