Последовательный вывод данных из метода в текстовое поле - Java
Формулировка задачи:
Добрый день!
Начинаю осваивать java, поэтому ещё плаваю во многих вопросах. Не могу понять как можно реализовать вывод данных в текстовое поле в процессе выполнения метода, если это вообще возможно. Перепробовал уже кучу вариантов, но безуспешно. Видимо чего то ещё недопонял. Код программы такой:
В консоли выглядит всё красиво, информация выводится последовательно в процессе выполнения метода. В текстовое же поле выводится уже по завершению. Уже голову сломал. Прошу направить в нужном направлении...
//импорт графических библиотек
import javax.swing.*;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.SystemColor;
import java.awt.event.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.InetAddress;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class Test1 {
private JFrame frame;
/**
* запуск приложения
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test1 window = new Test1();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* создание приложения
*/
public Test1() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame("Тест");
frame.setBounds(700, 200, 260, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new GridLayout(0, 1, 0, 0));
JPanel panel = new JPanel();
panel.setBackground(SystemColor.info);
frame.getContentPane().add(panel);
panel.setLayout(null);
JTextArea textArea = new JTextArea();
textArea.setBounds(4, 32, 244, 395);
textArea.setColumns(50);
textArea.setRows(16);
panel.add(textArea);
JButton btnPoll = new JButton("Выполнить");
btnPoll.setFont(new Font("Tahoma", Font.BOLD, 11));
btnPoll.setBackground(new Color(60, 179, 113));
btnPoll.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
textArea.setText("");
panel.add(textArea);
try {
/* Инициализируем переменные */
int a = 1;
int b = 2;
int c = 3;
String message = "";
//1. Устанавливаем параметры
...
//2. Выполняем действие 1
...
textArea.setText("Выполняем действие 1"+"\n");
System.out.println("Выполняем действие 1"); //выводим в консоль
//3. Выполняем действие 2
...
//4. Выполняем действие 3
System.out.println("Выполняем действие 3");
//формируем строку о подключении
message += "Параметр 1: "+ a + "\n";
message += "Параметр 2: " + b + "\n";
message += "Параметр 3: " + c + "\n";
textArea.append(message);
//Обрабатываем полученные данные
...
//вывод
System.out.println("Выполнено" );
textArea.append("Выполнено\n");
//6. Ловим ошибки
} catch (Exception ex) {
textArea.append("Ошибка выполнения"+"\n"); //выводим в текстовое поле
System.out.println("Ошибка выполнения"); //выводим в консоль
}
}
});
btnPoll.setBounds(4, 439, 89, 23);
panel.add(btnPoll);
JButton btnClose = new JButton("Закрыть");
btnClose.setBackground(new Color(240, 128, 128));
btnClose.setBounds(159, 439, 89, 23);
btnClose.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
});
panel.add(btnClose);
JLabel label = new JLabel("Данные");
label.setFont(new Font("Tahoma", Font.BOLD, 14));
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setBounds(35, 5, 160, 20);
panel.add(label);
}
}Решение задачи: «Последовательный вывод данных из метода в текстовое поле»
textual
Листинг программы
//импорт библиотек работы с модбас
import net.wimpi.modbus.io.ModbusTCPTransaction;
import net.wimpi.modbus.msg.ReadMultipleRegistersRequest;
import net.wimpi.modbus.msg.ReadMultipleRegistersResponse;
import net.wimpi.modbus.net.TCPMasterConnection;
import net.wimpi.modbus.util.ModbusUtil;
//импорт графических библиотек
import javax.swing.*;
import java.awt.*;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.SystemColor;
import java.awt.event.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.InetAddress;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class TestMast5 extends JFrame {
private JFrame frame;
private JButton btnPoll, btnClose;
private Task task;
//private JTextArea textArea;
public TestMast5() {
createAndShowGUI();
}
private void createAndShowGUI() {
frame = new JFrame();
frame.setBounds(700, 200, 260, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new GridLayout(0, 1, 0, 0));
JPanel panel = new JPanel();
panel.setBackground(SystemColor.info);
frame.getContentPane().add(panel);
panel.setLayout(null);
JTextArea textArea = new JTextArea();
textArea.setBounds(4, 32, 244, 395);
textArea.setColumns(50);
textArea.setRows(16);
panel.add(textArea);
btnPoll = new JButton("Опросить");
btnPoll.setFont(new Font("Tahoma", Font.BOLD, 11));
btnPoll.setBackground(new Color(60, 179, 113));
btnPoll.setBounds(4, 439, 89, 23);
btnPoll.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
btnPoll.setEnabled(false);
btnClose.setEnabled(true);
task = new Task();
task.execute();
}
});
btnClose = new JButton("Отмена");
btnClose.setBackground(new Color(240, 128, 128));
btnClose.setBounds(159, 439, 89, 23);
btnClose.setEnabled(false);
btnClose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
task.cancel(true);
//btnClose.setEnabled(false);
//btnPoll.setEnabled(true);
System.exit(0);
}
});
panel.add(btnPoll);
panel.add(btnClose);
JLabel label = new JLabel("Данные объекта");
label.setFont(new Font("Tahoma", Font.BOLD, 14));
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setBounds(35, 5, 160, 20);
panel.add(label);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TestMast5 testMast = new TestMast5();
testMast.frame.setVisible(true);
}
});
}
class Task extends SwingWorker<String, String> {
//private JTextArea textArea;
JTextArea textArea = new JTextArea(); //были ошибки, добавил - ушли
@Override
protected String doInBackground() throws Exception {
//textArea.setText("");
String message = "";
try {
/* Инициализируем переменные */
int port = ххх; //порт
int from = 0; //начальное значение регистра для чтения
int count = 40; //количество считываемых регистров
int SlaveAddr=хх; //адрес устройства
String astr = "ххх.ххх.ххх.ххх"; //IP адрес
int repeat = 1; //количество повторов опроса
//String message = "";
InetAddress addr = InetAddress.getByName(astr); //создаем переменную адреса
TCPMasterConnection con = new TCPMasterConnection(addr); //создаем переменную соединения
ModbusTCPTransaction trans = null; //инициализируем переменную процесса выполнения передачи
//1. Устанавливаем параметры для опроса
ReadMultipleRegistersRequest req = new ReadMultipleRegistersRequest(from,count); //создаем переменную для запроса
ReadMultipleRegistersResponse res = new ReadMultipleRegistersResponse(); //создаем переменную для ответа
req.setUnitID(SlaveAddr); //устанавливаем адрес устройства для запроса
res.setUnitID(SlaveAddr); //устанавливаем адрес устройства для ответа
//2. Открываем соединение
//textArea.setText("Установка соединения..."+"\n");
message = "Установка соединения...";
publish(message);
System.out.println("Установка соединения..."); //выводим в консоль
con.setPort(port);
con.connect();
con.setTimeout(30000);
System.out.println("Выполнено подключение к "+ astr);
//3. Запускаем процесс передачи
trans = new ModbusTCPTransaction(con);
trans.setRetries(5);
trans.setReconnecting(true);
trans.setRequest(req);
trans.execute();
message = "Выполнено подключение к "+ astr;
publish(message);
//4. Получаем ответ
res = (ReadMultipleRegistersResponse) trans.getResponse();
System.out.println("Считано " + count + " регистров с " + Integer.toString(from) + "\n");
//формируем строку о подключении
...
//Обрабатываем полученные данные
//Формируем текущее время компьютера
...
//Формируем строку времени из полученных регистров
...
//вывод в консоль
...
//формируем строку из полученных данных
...
//5. Формируем сообщение
//textArea.append(message);
//6. Закрываем соединение
con.close();
System.out.println("Соединение закрыто");
//textArea.append("Соединение закрыто"+"\n");
//System.exit(0); //команда завершения программы (сейчас выполняется при закрытии окна)
//6. Ловим ошибки
} catch (Exception ex) {
//textArea.append("Ошибка соединения"+"\n"); //выводим в текстовое поле
//ex.printStackTrace(); //выводит в консоль полную информацию об ошибках библиотеки
System.out.println("Ошибка соединения"); //выводим в консоль
}
return message;
}
@Override
protected void process(List<String> chunks) {
// Messages received from the doInBackground() (when invoking the publish() method)
for (String string : chunks) {
textArea.append(string + "\n");
}
//textArea.append(message + "\n");
}
}
}