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