Последовательный вывод данных из метода в текстовое поле - 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");
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д