线程输出到GUI文本字段



我试图在GUI中的文本字段中输出输出,但我要获得的只是线程信息。这只是完整代码中的一小部分,但完整版具有相同的问题。完整版具有同时运行的5个不同线程。任何帮助或建议将不胜感激。

public class O21 implements Runnable {
@Override
public void run() {
    try {
        Scanner O1 = new Scanner(new File("O21.txt"));
        O1.useDelimiter(",");
        while (O1.hasNext()) {
            String a = O1.next();
            int aa = Integer.parseInt(a);
            Thread.sleep(500); // Time delay to sync output
            if (a.trim().isEmpty()) {
                continue;
            }
            System.out.println(a);
        }
    } catch (Exception f) {
        f.printStackTrace();
    }}}

这是主要的。

public class Window {
    private JFrame frmTest;
    private JTextField txtTank1;
    private JTextField textField_4;
    static String o1;
/**
 * Launch the application.
 */
public static void main(String[] args) throws Exception {
    Thread a = new Thread(new O21());
    a.start();
    o1= a.toString();
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Window window = new Window();
                window.frmTest.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
/**
 * Create the application.
 */
public Window() {
    initialize();
}
/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frmTest = new JFrame();
    frmTest.setAlwaysOnTop(true);
    frmTest.setResizable(false);
    frmTest.setBounds(100, 100, 350, 400);
    frmTest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frmTest.getContentPane().setLayout(null);
    txtTank1 = new JTextField();
    txtTank1.setText("Tank1");
    txtTank1.setFont(new Font("Tahoma", Font.PLAIN, 20));
    txtTank1.setEditable(false);
    txtTank1.setColumns(10);
    txtTank1.setBounds(10, 60, 150, 50);
    frmTest.getContentPane().add(txtTank1);
    textField_4 = new JTextField();
    textField_4.setEditable(true);
    textField_4.setText(o1);
    textField_4.setFont(new Font("Tahoma", Font.PLAIN, 20));
    textField_4.setColumns(10);
    textField_4.setBounds(170, 60, 150, 50);
    frmTest.getContentPane().add(textField_4);
}}

您是一次写入O1,并且仅从线程中获取默认的toString(),所以除了垃圾之外,您什么都看不到,我并不感到惊讶。我的建议:

  • 在您的GUI内部创建SwingWorker<Void, String>
  • 从Swingworker的Doinbackground中运行长期运行的代码
  • 通过调用publish(...),通过字符串来发布GUI所需的任何字符串。
  • 使用Swingworker的process(...)方法在GUI中显示它们。
  • 不要使用静态变量作为kludge来在线程之间进行通信。这是一个非常容易折磨的非解决方案。
  • 避免在秋千GUI中调用setBounds()。虽然Null布局和setBounds()似乎像创建复杂的GUI的最简单和最佳方法一样摆动新手,但使用它们时,使用它们时就会遇到越严重的困难。它们不会调整您的组件大小时,当GUI大小时,它们是一个可以增强或维护的皇家女巫,当放置在卷轴上时,它们完全失败,当在所有平台或屏幕分辨率上观看时,它们看起来很可怕。而是了解并使用布局管理器。
  • 请查看:教程:秋千的并发。

例如。

import java.io.File;
import java.util.List;
import java.util.Scanner;
import javax.swing.*;
public class SwingThreadingEg extends JPanel implements MyAppendable {
   private JTextArea area = new JTextArea(30, 50);
   public SwingThreadingEg() {
      JScrollPane scrollPane = new JScrollPane(area);
      scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
      add(scrollPane);
   }
   @Override
   public void append(String text) {
      area.append(text);
   }
   private static void createAndShowGui() {
      SwingThreadingEg mainPanel = new SwingThreadingEg();
      MyWorker myWorker = new MyWorker(mainPanel);
      // add a Prop Change listener here to listen for 
      // DONE state then call get() on myWorker
      myWorker.execute();
      JFrame frame = new JFrame("SwingThreadingEg");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }
   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
class MyWorker extends SwingWorker<Void, String> {
   private MyAppendable myAppendable;
   public MyWorker(MyAppendable myAppendable) {
      this.myAppendable = myAppendable;
   }
   @Override
   protected Void doInBackground() throws Exception {
      try (Scanner O1 = new Scanner(new File("O21.txt"))) {
         O1.useDelimiter(",");
         while (O1.hasNext()) {
            String a = O1.next();
            int aa = Integer.parseInt(a);
            Thread.sleep(500); // Time delay to sync output
            if (a.trim().isEmpty()) {
               continue;
            }
            System.out.println(a);
            publish(a);
         }
      } catch (Exception f) {
         f.printStackTrace();
      }
      return null;
   }
   @Override
   protected void process(List<String> chunks) {
      for (String text : chunks) {
         myAppendable.append(text + "n");
      }
   }
}
interface MyAppendable {
   public void append(String text);
}

最新更新