JTextArea .setText/.append не работает

У меня проблемы с настройкой текста внутри 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
Сюзи работает, счет = 1
Эдна работает, счет = 0
Тим работает, количество = 2
Эдна работает, количество = 1
Сюзи работает, количество = 2
Эдна работает, количество = 2
Тим работает, количество = 3
Сюзи работает, количество = 3
Эдна работает, количество = 3

Вот фрагмент кода, с которым у меня возникла проблема:

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

Он соответствует очень хорошо.. Я просто не получаю результат - поэтому я думаю, что это что-то очень простое, чего мне просто не хватает.

ВОТ МОЙ НОВЫЙ КОД: я получаю ошибки «не могу найти символ» для фрейма теперь внутри прослушивателей действий и «не могу найти символ» на 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);
            }
        }
    }
}

person ProgrammingPrincess    schedule 07.11.2014    source источник
comment
Если проблема в том, что текст не меняется в textArea в окне, вам может потребоваться вызвать repaint() в JFrame, чтобы перерисовать компоненты.   -  person Neil Locketz    schedule 07.11.2014


Ответы (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, который им нужно использовать. переменная рамка была определена только в основном методе, поэтому вы не могли использовать ее в классе SimpleFrame.
  • Я дал панели прокрутки имя, я назвал ее jsp и сделал все видимым в нижней части конструктора jta.setVisible(true); jsp.setVisible(true); topPanel.setVisible(true); setVisible(true);
  • Я удалил static из jta в его объявлении в SimpleFrame. вы не хотите, чтобы это было одинаковым для каждого SimpleFrame.

Если у вас есть дополнительные вопросы, вы можете написать мне по электронной почте (мой адрес электронной почты виден в моем профиле). Поскольку вы впервые на сайте, вы должны принять ответ, нажав на галочку, потому что это закрывает вопрос.

person Neil Locketz    schedule 07.11.2014
comment
Спасибо за вклад, я не знаком с repaint(). Я поставил jta.repaint(); а также SimpleFrame.repaint(), и я не получаю ничего другого. - person ProgrammingPrincess; 07.11.2014
comment
Извините - всякий раз, когда я помещаю SimpleFrame.repaint(), я получаю сообщение об ошибке, на нестатический метод repaint() нельзя ссылаться из статического контекста. Любые идеи о том, как решить эту проблему? - person ProgrammingPrincess; 07.11.2014
comment
Отредактировано: вы подкласс JFrame, вы можете просто написать repaint(), он вызовет метод в суперклассе - person Neil Locketz; 07.11.2014
comment
У меня есть решение, оно связано с тем, как вы создаете свои runnables. Поскольку вы создаете подкласс SimpleFrame и создаете новый myRunnable со своими собственными текстовыми областями, вы не редактируете текстовую область основного окна. Я предлагаю удалить расширения и добавить текстовую область в качестве аргумента в конструктор myRunnable. Вы можете сохранить текстовое поле как поле и использовать его. Возможно, вам придется добавить рамку в качестве аргумента, если перерисовка не работает. - person Neil Locketz; 07.11.2014
comment
Хорошо, я думаю, что это охватывает все, что вы должны быть в порядке, чтобы идти сейчас. (Я сделал много правок в ответе) - person Neil Locketz; 07.11.2014
comment
Я, возможно, был неясен, я хочу, чтобы ВЕСЬ текст был на ОДНОМ jta. Не все отдельно. Я удалил Extends SimpleFrame из своего исполняемого класса. Я добавляю фрейм и jta в конструктор для myRunnable, но все равно получаю ошибку «Не могу найти символ для моего фрейма». - person ProgrammingPrincess; 07.11.2014
comment
Он говорит, что это слишком долго... есть ли другая область, куда я могу отправить его? Это мой первый пост, поэтому я не уверен.. - person ProgrammingPrincess; 07.11.2014
comment
Просто добавьте обновление к вопросу с новым кодом внизу. мы могли бы использовать чат, но у вас еще недостаточно представителей. - person Neil Locketz; 07.11.2014
comment
Хорошо, я добавил обновление .. спасибо за вашу помощь! Я был на этой программе в течение недели! - person ProgrammingPrincess; 07.11.2014
comment
Хорошо, я отредактировал опубликованный вами код, чтобы он заработал, и включил внесенные изменения в свой ответ. - person Neil Locketz; 07.11.2014
comment
Боже мой, большое спасибо. Ты мой герой!! Ха-ха, я должен был подумать о SimpleFrame.this момент facepalm - person ProgrammingPrincess; 07.11.2014
comment
Не забудьте проголосовать и принять ;). Не проблема! - person Neil Locketz; 07.11.2014
comment
Я принял, нажав на галочку, я пока не могу проголосовать, потому что я не представитель 15-го уровня .. но как только я это сделаю, я вернусь и проголосую за вас :) - person ProgrammingPrincess; 07.11.2014
comment
Не беспокойтесь об этом так много. Это действительно не так важно. - person Neil Locketz; 07.11.2014