Последовательный вывод данных из метода в текстовое поле - Java

Узнай цену своей работы

Формулировка задачи:

Добрый день! Начинаю осваивать java, поэтому ещё плаваю во многих вопросах. Не могу понять как можно реализовать вывод данных в текстовое поле в процессе выполнения метода, если это вообще возможно. Перепробовал уже кучу вариантов, но безуспешно. Видимо чего то ещё недопонял. Код программы такой:
Листинг программы
  1. //импорт графических библиотек
  2. import javax.swing.*;
  3. import java.awt.Color;
  4. import java.awt.EventQueue;
  5. import java.awt.Font;
  6. import java.awt.GridLayout;
  7. import java.awt.SystemColor;
  8. import java.awt.event.*;
  9. import java.math.BigDecimal;
  10. import java.math.RoundingMode;
  11. import java.net.InetAddress;
  12. import java.text.DateFormat;
  13. import java.text.SimpleDateFormat;
  14. import java.util.Date;
  15. import java.util.Locale;
  16. public class Test1 {
  17. private JFrame frame;
  18. /**
  19. * запуск приложения
  20. */
  21. public static void main(String[] args) {
  22. EventQueue.invokeLater(new Runnable() {
  23. public void run() {
  24. try {
  25. Test1 window = new Test1();
  26. window.frame.setVisible(true);
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. });
  32. }
  33. /**
  34. * создание приложения
  35. */
  36. public Test1() {
  37. initialize();
  38. }
  39. /**
  40. * Initialize the contents of the frame.
  41. */
  42. private void initialize() {
  43. frame = new JFrame("Тест");
  44. frame.setBounds(700, 200, 260, 500);
  45. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  46. frame.getContentPane().setLayout(new GridLayout(0, 1, 0, 0));
  47. JPanel panel = new JPanel();
  48. panel.setBackground(SystemColor.info);
  49. frame.getContentPane().add(panel);
  50. panel.setLayout(null);
  51. JTextArea textArea = new JTextArea();
  52. textArea.setBounds(4, 32, 244, 395);
  53. textArea.setColumns(50);
  54. textArea.setRows(16);
  55. panel.add(textArea);
  56. JButton btnPoll = new JButton("Выполнить");
  57. btnPoll.setFont(new Font("Tahoma", Font.BOLD, 11));
  58. btnPoll.setBackground(new Color(60, 179, 113));
  59. btnPoll.addActionListener(new ActionListener() {
  60. public void actionPerformed(ActionEvent arg0) {
  61. textArea.setText("");
  62. panel.add(textArea);
  63. try {
  64. /* Инициализируем переменные */
  65. int a = 1;
  66. int b = 2;
  67. int c = 3;
  68. String message = "";
  69.  
  70. //1. Устанавливаем параметры
  71. ...
  72. //2. Выполняем действие 1
  73. ...
  74. textArea.setText("Выполняем действие 1"+"\n");
  75. System.out.println("Выполняем действие 1"); //выводим в консоль
  76. //3. Выполняем действие 2
  77. ...
  78. //4. Выполняем действие 3
  79. System.out.println("Выполняем действие 3");
  80. //формируем строку о подключении
  81. message += "Параметр 1: "+ a + "\n";
  82. message += "Параметр 2: " + b + "\n";
  83. message += "Параметр 3: " + c + "\n";
  84. textArea.append(message);
  85. //Обрабатываем полученные данные
  86. ...
  87. //вывод
  88. System.out.println("Выполнено" );
  89. textArea.append("Выполнено\n");
  90. //6. Ловим ошибки
  91. } catch (Exception ex) {
  92. textArea.append("Ошибка выполнения"+"\n"); //выводим в текстовое поле
  93. System.out.println("Ошибка выполнения"); //выводим в консоль
  94. }
  95. }
  96. });
  97. btnPoll.setBounds(4, 439, 89, 23);
  98. panel.add(btnPoll);
  99. JButton btnClose = new JButton("Закрыть");
  100. btnClose.setBackground(new Color(240, 128, 128));
  101. btnClose.setBounds(159, 439, 89, 23);
  102. btnClose.addActionListener(new ActionListener() {
  103. public void actionPerformed(ActionEvent arg0) {
  104. System.exit(0);
  105. }
  106. });
  107. panel.add(btnClose);
  108. JLabel label = new JLabel("Данные");
  109. label.setFont(new Font("Tahoma", Font.BOLD, 14));
  110. label.setHorizontalAlignment(SwingConstants.CENTER);
  111. label.setBounds(35, 5, 160, 20);
  112. panel.add(label);
  113. }
  114. }
В консоли выглядит всё красиво, информация выводится последовательно в процессе выполнения метода. В текстовое же поле выводится уже по завершению. Уже голову сломал. Прошу направить в нужном направлении...

Решение задачи: «Последовательный вывод данных из метода в текстовое поле»

textual
Листинг программы
  1. //импорт библиотек работы с модбас
  2. import net.wimpi.modbus.io.ModbusTCPTransaction;
  3. import net.wimpi.modbus.msg.ReadMultipleRegistersRequest;
  4. import net.wimpi.modbus.msg.ReadMultipleRegistersResponse;
  5. import net.wimpi.modbus.net.TCPMasterConnection;
  6. import net.wimpi.modbus.util.ModbusUtil;
  7.  
  8. //импорт графических библиотек
  9. import javax.swing.*;
  10. import java.awt.*;
  11.  
  12. import java.awt.Color;
  13. import java.awt.EventQueue;
  14. import java.awt.Font;
  15. import java.awt.GridLayout;
  16. import java.awt.SystemColor;
  17. import java.awt.event.*;
  18. import java.math.BigDecimal;
  19. import java.math.RoundingMode;
  20. import java.net.InetAddress;
  21. import java.text.DateFormat;
  22. import java.text.SimpleDateFormat;
  23. import java.util.Date;
  24. import java.util.List;
  25.  
  26. public class TestMast5 extends JFrame {
  27.    
  28.     private JFrame frame;
  29.     private JButton btnPoll, btnClose;
  30.     private Task task;
  31.     //private JTextArea textArea;  
  32.    
  33.     public TestMast5() {
  34.         createAndShowGUI();
  35.         }
  36.        
  37.     private void createAndShowGUI() {
  38.         frame = new JFrame();
  39.         frame.setBounds(700, 200, 260, 500);
  40.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  41.         frame.getContentPane().setLayout(new GridLayout(0, 1, 0, 0));
  42.        
  43.         JPanel panel = new JPanel();
  44.         panel.setBackground(SystemColor.info);
  45.         frame.getContentPane().add(panel);
  46.         panel.setLayout(null);
  47.  
  48.         JTextArea textArea = new JTextArea();
  49.         textArea.setBounds(4, 32, 244, 395);
  50.         textArea.setColumns(50);
  51.         textArea.setRows(16);
  52.         panel.add(textArea);
  53.        
  54.         btnPoll = new JButton("Опросить");
  55.         btnPoll.setFont(new Font("Tahoma", Font.BOLD, 11));
  56.         btnPoll.setBackground(new Color(60, 179, 113));
  57.         btnPoll.setBounds(4, 439, 89, 23);
  58.         btnPoll.addActionListener(new ActionListener() {
  59.             @Override
  60.             public void actionPerformed(ActionEvent e) {
  61.                 btnPoll.setEnabled(false);
  62.                 btnClose.setEnabled(true);
  63.                 task = new Task();
  64.                 task.execute();
  65.                 }
  66.             });
  67.         btnClose = new JButton("Отмена");
  68.         btnClose.setBackground(new Color(240, 128, 128));
  69.         btnClose.setBounds(159, 439, 89, 23);
  70.         btnClose.setEnabled(false);
  71.         btnClose.addActionListener(new ActionListener() {
  72.             @Override
  73.             public void actionPerformed(ActionEvent e) {
  74.                 task.cancel(true);
  75.                 //btnClose.setEnabled(false);
  76.                 //btnPoll.setEnabled(true);
  77.                 System.exit(0);
  78.                 }
  79.             });
  80.         panel.add(btnPoll);
  81.         panel.add(btnClose);
  82.  
  83.         JLabel label = new JLabel("Данные объекта");
  84.         label.setFont(new Font("Tahoma", Font.BOLD, 14));
  85.         label.setHorizontalAlignment(SwingConstants.CENTER);
  86.         label.setBounds(35, 5, 160, 20);
  87.         panel.add(label);
  88.         }
  89.        
  90.     public static void main(String[] args) {
  91.         SwingUtilities.invokeLater(new Runnable() {
  92.             @Override
  93.             public void run() {
  94.                 TestMast5 testMast = new TestMast5();
  95.                 testMast.frame.setVisible(true);
  96.             }
  97.         });
  98.     }
  99.  
  100.     class Task extends SwingWorker<String, String> {
  101.  
  102.         //private JTextArea textArea;
  103.         JTextArea textArea = new JTextArea(); //были ошибки, добавил - ушли
  104.  
  105.          @Override
  106.         protected String doInBackground() throws Exception {
  107.             //textArea.setText("");
  108.             String message = "";
  109.             try {              
  110.                 /* Инициализируем переменные */
  111.                 int port = ххх;                 //порт
  112.                 int from = 0;                   //начальное значение регистра для чтения
  113.                 int count = 40;                 //количество считываемых регистров
  114.                 int SlaveAddr=хх;               //адрес устройства
  115.                 String astr = "ххх.ххх.ххх.ххх";    //IP адрес
  116.                 int repeat = 1;                 //количество повторов опроса
  117.                 //String message = "";
  118.  
  119.                 InetAddress addr = InetAddress.getByName(astr);             //создаем переменную адреса
  120.                 TCPMasterConnection con = new TCPMasterConnection(addr);    //создаем переменную соединения
  121.                 ModbusTCPTransaction trans = null;                          //инициализируем переменную процесса выполнения передачи
  122.  
  123.                 //1. Устанавливаем параметры для опроса
  124.                 ReadMultipleRegistersRequest req = new ReadMultipleRegistersRequest(from,count);    //создаем переменную для запроса
  125.                 ReadMultipleRegistersResponse res = new ReadMultipleRegistersResponse();            //создаем переменную для ответа
  126.                 req.setUnitID(SlaveAddr);       //устанавливаем адрес устройства для запроса  
  127.                 res.setUnitID(SlaveAddr);       //устанавливаем адрес устройства для ответа
  128.  
  129.                 //2. Открываем соединение
  130.                 //textArea.setText("Установка соединения..."+"\n");
  131.                 message = "Установка соединения...";
  132.                 publish(message);
  133.                 System.out.println("Установка соединения...");  //выводим в консоль
  134.                 con.setPort(port);
  135.                 con.connect();
  136.                 con.setTimeout(30000);
  137.                 System.out.println("Выполнено подключение к  "+ astr);
  138.  
  139.                 //3. Запускаем процесс передачи
  140.                 trans = new ModbusTCPTransaction(con);
  141.                 trans.setRetries(5);
  142.  
  143.                 trans.setReconnecting(true);
  144.                 trans.setRequest(req);
  145.                 trans.execute();
  146.                 message = "Выполнено подключение к  "+ astr;
  147.                 publish(message);
  148.  
  149.  
  150.                 //4. Получаем ответ
  151.                 res = (ReadMultipleRegistersResponse) trans.getResponse();
  152.                 System.out.println("Считано " + count + " регистров  с " + Integer.toString(from) + "\n");
  153.  
  154.                 //формируем строку о подключении
  155.                 ...
  156.  
  157.                 //Обрабатываем полученные данные
  158.                 //Формируем текущее время компьютера
  159.                 ...
  160.  
  161.                 //Формируем строку времени из полученных регистров
  162.                 ...
  163.  
  164.                 //вывод в консоль
  165.                 ...
  166.  
  167.                 //формируем строку из полученных данных
  168.                 ...
  169.  
  170.                 //5. Формируем сообщение
  171.                 //textArea.append(message);
  172.  
  173.                 //6. Закрываем соединение
  174.                 con.close();
  175.  
  176.                 System.out.println("Соединение закрыто");
  177.                 //textArea.append("Соединение закрыто"+"\n");
  178.                 //System.exit(0);   //команда завершения программы (сейчас выполняется при закрытии окна)
  179.  
  180.                 //6. Ловим ошибки
  181.                 } catch (Exception ex) {
  182.                     //textArea.append("Ошибка соединения"+"\n");    //выводим в текстовое поле
  183.                     //ex.printStackTrace();     //выводит в консоль полную информацию об ошибках библиотеки
  184.                     System.out.println("Ошибка соединения");        //выводим в консоль
  185.                     }
  186.  
  187.             return message;
  188.         }
  189.        
  190.         @Override
  191.         protected void process(List<String> chunks) {
  192.           // Messages received from the doInBackground() (when invoking the publish() method)
  193.             for (String string : chunks) {
  194.                textArea.append(string + "\n");
  195.                }
  196.             //textArea.append(message + "\n");
  197.         }
  198.     }
  199. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы