Проблема с добавлением потоков в программу.Java
Есть программа , и нужно добавить поток (BaseAI) ,который будет работать с объектами. Рисование должно остаться в главном потоке . Синхронизировать роботу потоков с рисованием (через передачу данных в основной поток). Пробовал сделать основную функцию в потоке,но у меня всегда были проблемы с передачей данных в основной поток. Очень прошу,помогите пожалуйста разобраться (может есть пример какой то, либо знаете сайт который сможет помочь) Я только начал работать с потоками поэтому не судите строго.
Код:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
public class LabSixFirst extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
private JFrame wnd;
private float w, q, p;
private int t0, t;
private Timer timer;
private JButton start, stop, apply;
private JLabel ql, wl;
private JTextField qtf, wtf;
public static void main(String[] args) {
new LabSixFirst();
}
LabSixFirst() {
w = 5;
q = 50;
t0 = 1000/60;
timer = new Timer(t0, this);
timer.setActionCommand("timer");
wnd = new JFrame("Lab-6.1");
wnd.setLayout(null);
wnd.setSize(500, 500);
wnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 50, 300, 300);
start = new JButton("Start");
stop = new JButton("Stop");
apply = new JButton("Apply");
ql = new JLabel("q");
wl = new JLabel("w");
qtf = new JTextField(q + "");
wtf = new JTextField(w + "");
ql.setBounds(5, 380, 20, 20);
wl.setBounds(5, 400, 20, 20);
qtf.setBounds(30, 380, 40, 20);
wtf.setBounds(30, 400, 40, 20);
start.setActionCommand("start");
stop.setActionCommand("stop");
apply.setActionCommand("apply");
start.addActionListener(this);
stop.addActionListener(this);
apply.addActionListener(this);
start.setBounds(300, 430, 80, 20);
stop.setBounds(390, 430, 80, 20);
apply.setBounds(5, 430, 80, 20);
wnd.add(this);
wnd.add(start);
wnd.add(stop);
wnd.add(apply);
wnd.add(ql);
wnd.add(wl);
wnd.add(qtf);
wnd.add(wtf);
wnd.setVisible(true);
}
@Override
protected void paintComponent(Graphics g) {
Random ra= new Random();
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.setColor(Color.BLACK);
g2d.drawLine(getWidth()/2 - (int)(q/2.0f), getHeight()/2, getWidth()/2 + (int)(q/2.0f), getHeight()/2);
g2d.setColor(Color.RED);
g2d.fillOval(getWidth()/2 - (int)(q/2.0f + 3) + (int)p, getHeight()/2 -3, 6, 6);
}
@Override
public void actionPerformed(ActionEvent e) {
switch (e.getActionCommand()) {
case "stop" : {
timer.stop();
break;
}
case "start" : {
timer.start();
break;
}
case "apply" : {
float a, b;
try {
a = Float.parseFloat(qtf.getText());
b = Float.parseFloat(wtf.getText());
q = a;
w = b;
repaint();
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(null, "Invalid input", "Error", JOptionPane.ERROR_MESSAGE);
}
break;
}
case "timer" : {
p = q * (float)(1.0f + Math.cos(w * t /1000 - Math.PI)) / 2.0f;
repaint();
t+=t0;
break;
}
}
}
}
Один из примеров того что я пробовал:
static class oThread extends Thread implements ActionListener{
public void run(){
t0 = 1000/60;
timer = new Timer(t0, this);
timer.setActionCommand("timer");
}
@Override
public void actionPerformed(ActionEvent actionEvent) {
switch (actionEvent.getActionCommand()) {
case "timer":
{
p = q * (float) (1.0f + Math.cos(w * t / 1000 - Math.PI)) / 2.0f;
repaint();
t += t0;
break;
}
}
}
}
Ответы (1 шт):
Если вам конкретно про Swing, то вам нужен javax.swing.SwingWorker. В Интернете можно найти много примеров использования, да и в любом пособии по Swing обязательно должно быть. Если же вы просто хотите разобраться с многопоточностю, что начинать со Swing неудачная идея.