【问题标题】:JTextArea .setText/.append Not WorkingJTextArea .setText/.append 不工作
【发布时间】:2015-01-04 11:41:33
【问题描述】:

我在设置 JTextArea 内的文本时遇到问题。我的程序使用 3 个线程使用增量打印到 JTextArea 上。我可以毫无问题地使用 System.out.println 打印到命令提示符,但由于某种原因,我无法打印到 JTextArea。我是这个网站的新手,所以如果您需要更多信息,请告诉我!感谢您的帮助!

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

class SimpleFrame extends JFrame
{
    public static final int HEIGHT = 500;
    public static final int WIDTH = 600;
    public static JTextArea jta;

    public SimpleFrame()
    {
        setSize(WIDTH, HEIGHT);

        setLayout(new BorderLayout());

        JPanel topPanel = new JPanel();
        final JButton tim = new JButton("Tim (5 sec)");
        final JButton suzy = new JButton("Suzy (3 sec)");
        final JButton edna = new JButton("Edna (2 sec)");
        topPanel.add(tim);
        topPanel.add(suzy);
        topPanel.add(edna);
        add(topPanel, BorderLayout.NORTH);

        JPanel textPanel = new JPanel();
        jta = new JTextArea(10,10);
        jta.setFont(new Font("SansSerif", Font.PLAIN, 20));
        add(new JScrollPane(jta), BorderLayout.CENTER);

        tim.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                    Runnable r1 = new myRunnable(5, "Tim", "Tim", 5000);
                    Thread t1 = new Thread(r1);
                    t1.start();
                    tim.setEnabled(false);
            }
        });

        suzy.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                    Runnable r2 = new myRunnable(3, "Suzy", "Suzy", 3000);
                    Thread t2 = new Thread(r2);
                    t2.start();
                    suzy.setEnabled(false);
            }
        });

        edna.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                    Runnable r3 = new myRunnable(1, "Edna", "Edna", 1000);
                    Thread t3 = new Thread(r3);
                    t3.start();
                    edna.setEnabled(false);
            }
        });
    }
}

class myRunnable extends SimpleFrame implements Runnable
{
    int workerTime;
    String name;
    String threadToRun;
    int runtimeDelay;

    public myRunnable(int time, String workerName, String thread, int delay)
    {
        workerTime = time;
        name = workerName;
        threadToRun = thread;
        runtimeDelay = delay;
    }

    public void run()
    {
        int i = 0;

        while(i < 10)
        {
            try
            {
                jta.append(name + " is working, count = " + workerTime + "\n");
                workerTime += workerTime;
                Thread.sleep(runtimeDelay);
            }
            catch(InterruptedException e)
            {
                System.out.println("Error: " + e);
            }
        }
    }
}

public class Names
{
    public static void main(String[] args)
    {
                SimpleFrame frame = new SimpleFrame();
                frame.setTitle("Multi Thread Workers");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
    }
}

JTextArea 应该打印类似这样的内容:

蒂姆正在工作,计数 = 0
蒂姆正在工作,计数 = 1
苏西正在工作,计数 = 0
Suzy 正在工作,计数 = 1
Edna 正在工作,计数 = 0
蒂姆正在工作,计数 = 2
Edna 正在工作,计数 = 1
苏西正在工作,计数 = 2
Edna 正在工作,计数 = 2
蒂姆正在工作,计数 = 3
苏西正在工作,计数 = 3
Edna 正在工作,count = 3

这是我遇到问题的代码片段:

jta.append(name + " is working, count = " + workerTime + "\n");
workerTime += workerTime;
Thread.sleep(runtimeDelay);

它符合得很好。我只是没有得到输出——这就是为什么我认为这是我只是想念的超级简单的东西。

这是我的新代码:我现在在 actionlisteners 中收到框架的“找不到符号”错误,在 jta.append 上收到“找不到符号”

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

public class Names
{
    public static void main(String[] args)
    {
                SimpleFrame frame = new SimpleFrame();
                frame.setTitle("Multi Thread Workers");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
    }
}
class SimpleFrame extends JFrame
{
    public static final int HEIGHT = 500;
    public static final int WIDTH = 600;
    public static JTextArea jta;

    public SimpleFrame()
    {
        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        setVisible(true);

        JPanel topPanel = new JPanel();
        final JButton tim = new JButton("Tim (5 sec)");
        final JButton suzy = new JButton("Suzy (3 sec)");
        final JButton edna = new JButton("Edna (2 sec)");
        topPanel.add(tim);
        topPanel.add(suzy);
        topPanel.add(edna);
        add(topPanel, BorderLayout.NORTH);

        JPanel textPanel = new JPanel();
        jta = new JTextArea(10,10);
        jta.setFont(new Font("SansSerif", Font.PLAIN, 20));
        add(new JScrollPane(jta), BorderLayout.CENTER);

        tim.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                    Runnable r1 = new myRunnable(5, "Tim", "Tim", 5000, frame, jta);
                    Thread t1 = new Thread(r1);
                    t1.start();
                    tim.setEnabled(false);
            }
        });

        suzy.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                    Runnable r2 = new myRunnable(3, "Suzy", "Suzy", 3000, frame, jta);
                    Thread t2 = new Thread(r2);
                    t2.start();
                    suzy.setEnabled(false);
            }
        });

        edna.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                    Runnable r3 = new myRunnable(1, "Edna", "Edna", 1000, frame, jta);
                    Thread t3 = new Thread(r3);
                    t3.start();
                    edna.setEnabled(false);
            }
        });
    }
}

class myRunnable implements Runnable
{
    int workerTime;
    String name;
    String threadToRun;
    int runtimeDelay;
    JFrame frame;
    JTextArea jTextArea;

    public myRunnable(int time, String workerName, String thread, int delay, JFrame f, JTextArea j)
    {
        workerTime = time;
        name = workerName;
        threadToRun = thread;
        runtimeDelay = delay;
        frame = f;
        jTextArea = j;
    }

    public void run()
    {
        int i = 0;

        while(i < 10)
        {
            try
            {
                jta.append(name + " is working, count = " + workerTime);
                workerTime += workerTime;
                frame.repaint();
                Thread.sleep(runtimeDelay);
            }
            catch(InterruptedException e)
            {
                System.out.println("Error: " + e);
            }
        }
    }
}

【问题讨论】:

  • 如果问题是窗口中 textArea 中的文本没有变化,您可能需要在 JFrame 上调用 repaint() 来重绘组件

标签: java multithreading append jtextarea settext


【解决方案1】:

这是您编辑的代码,以便它可以按照您的意愿工作。

我将在底部列出更改列表

public class Names {
    public static void main(String[] args) {
        SimpleFrame frame = new SimpleFrame();
        frame.setTitle("Multi Thread Workers");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
class SimpleFrame extends JFrame {
   public static final int HEIGHT = 500;
   public static final int WIDTH = 600;
   public JTextArea jta;

   public SimpleFrame() {
       setSize(WIDTH, HEIGHT);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
       setLayout(new BorderLayout());

       JPanel topPanel = new JPanel();
       final JButton tim = new JButton("Tim (5 sec)");
       final JButton suzy = new JButton("Suzy (3 sec)");
       final JButton edna = new JButton("Edna (2 sec)");
       topPanel.add(tim);
       topPanel.add(suzy);
       topPanel.add(edna);
       add(topPanel, BorderLayout.NORTH);

       JPanel textPanel = new JPanel();
       jta = new JTextArea(10, 10);
       jta.setFont(new Font("SansSerif", Font.PLAIN, 20));
       JScrollPane jsp = new JScrollPane(jta);
       add(jsp, BorderLayout.CENTER);

       tim.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent event) {
               Runnable r1 = new myRunnable(5, "Tim", "Tim", 5000,
                    SimpleFrame.this, jta);
               Thread t1 = new Thread(r1);
               t1.start();
               tim.setEnabled(false);
           }
       });

       suzy.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent event) {
               Runnable r2 = new myRunnable(3, "Suzy", "Suzy", 3000,
               SimpleFrame.this, jta);
               Thread t2 = new Thread(r2);
               t2.start();
               suzy.setEnabled(false);
           }
       });

       edna.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent event) {
               Runnable r3 = new myRunnable(1, "Edna", "Edna", 1000,
                       SimpleFrame.this, jta);
               Thread t3 = new Thread(r3);
               t3.start();
               edna.setEnabled(false);
           }
       });
       jta.setVisible(true);
       jsp.setVisible(true);
       topPanel.setVisible(true);
       setVisible(true);
   }
}
class myRunnable implements Runnable {
int workerTime;
String name;
String threadToRun;
int runtimeDelay;
JFrame frame;
JTextArea jTextArea;

public myRunnable(int time, String workerName, String thread, int delay,
        JFrame f, JTextArea j) {
    workerTime = time;
    name = workerName;
    threadToRun = thread;
    runtimeDelay = delay;
    frame = f;
    jTextArea = j;
}

public void run() {
    int i = 0;

    while (i < 10) {
        try {
            jTextArea.append(name + " is working, count = " + workerTime);
            workerTime += workerTime;
            frame.repaint();
            Thread.sleep(runtimeDelay);
        } catch (InterruptedException e) {
            System.out.println("Error: " + e);
        }
    }
}
}

变化:

  • 我将按钮侦听器中框架的使用更改为SimpleFrame.this,因为您希望为每个线程提供一个他们需要使用的 jframe 实例。变量 frame 仅在 main 方法中定义,这就是您不能在 SimpleFrame 类中使用它的原因。
  • 我给滚动窗格起了一个名字,我称之为 jsp,并在构造函数的底部将所有内容设置为可见 jta.setVisible(true); jsp.setVisible(true); topPanel.setVisible(true); setVisible(true);
  • 我在 SimpleFrame 的声明中从 jta 中删除了 static。您不希望每个 SimpleFrame 都相同。

如果您还有其他问题,可以给我发电子邮件(我的电子邮件在我的个人资料中可见) 由于您是该网站的新手,因此您应该通过单击复选标记来接受答案,因为这会关闭问题。

【讨论】:

  • 感谢输入,我不熟悉 repaint()。我把 jta.repaint();以及 SimpleFrame.repaint(),我没有得到任何不同。
  • 抱歉——每当我输入 SimpleFrame.repaint() 时,我都会收到错误消息“无法从静态上下文引用非静态方法 repaint()”。关于如何解决这个问题的任何想法?
  • 已编辑:你是 JFrame 的子类,你可以只写 repaint() 它将调用超类中的方法
  • 我有解决方案,它以您创建可运行文件的方式。由于您将 SimpleFrame 子类化并创建了一个新的 myRunnable,它们有自己的文本区域,因此您不会编辑主窗口文本区域。我建议删除扩展并将文本区域作为参数添加到 myRunnable 的构造函数。您可以将 textarea 存储为一个字段并使用它。如果重新绘制不起作用,您可能还需要将框架添加为 arg。
  • 好的,我认为这涵盖了您现在应该做好的一切。 (我对答案做了很多修改)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 2012-10-11
  • 2013-02-08
  • 1970-01-01
相关资源
最近更新 更多