Последовательный вывод данных из метода в текстовое поле - 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");
        }
    }
}

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


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

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

6   голосов , оценка 4.333 из 5
Похожие ответы