У меня проблемы с настройкой текста внутри 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);
}
}
}
}