Swing и потоки - Java
Формулировка задачи:
Добрый день.
Пытаюсь написать приложение, которое должно делать следующее: кнопка Старт запускает поток для ПРогрессбара, он заполняется; при повторном нажатии поток должен остановиться. У меня получается что не только прогресс бар засыпает, но и все приложение. Что подправить?
Код
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
class Form extends JFrame{
JFrame j=new JFrame();
JButton b1=new JButton("Start");
JButton b2=new JButton("Prosto");
private BoundedRangeModel model;
JProgressBar p;
Mouse m=new Mouse();
ThreadProcess t1=new ThreadProcess();
JProgressBar pbUndefined;
Form(){
super("Поток-прогрессбар");
j.setLayout(new FlowLayout(FlowLayout.CENTER));
j.setSize(300,300);
j.setResizable(false);
j.setLocationRelativeTo(null);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
model=new DefaultBoundedRangeModel(1,2,0,10);
p=new JProgressBar(model);
j.add(p);
pbUndefined = new JProgressBar(0, 100);
pbUndefined.setStringPainted(true);
pbUndefined.setString("Привет");
j.add((pbUndefined));
b1.setSize(40,30);
b1.addMouseListener(m);
j.add(b1);
b1.setSize(40,30);
b2.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(j,"Hello");
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
j.add(b2);
j.setVisible(true);
}
class ThreadProcess extends Thread {
public void run() {
// Проверка завершения процесса
while ( model.getValue() < model.getMaximum() ) {
try {
// Увеличение текущего значение
model.setValue(model.getValue() + 1);
// Случайная временная задержка
sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class Mouse implements MouseListener {
private boolean f=false;
ThreadProcess t=new ThreadProcess();
@Override
public void mouseClicked(MouseEvent e) {
if(!t.isAlive()) {
t.start();
pbUndefined.setIndeterminate(true);
f=true;
}
else {
try {
t.sleep(3000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
pbUndefined.setIndeterminate(false);
f=false;
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
}
public class Test {
public static void main(String[] args) {
new Form();
}
}Решение задачи: «Swing и потоки»
textual
Листинг программы
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class Form extends JFrame{
JFrame j=new JFrame();
JButton b1=new JButton("Start");
JButton b2=new JButton("Prosto");
private BoundedRangeModel model;
JProgressBar p;
// Mouse m=new Mouse();
ButtonListener bListener = new ButtonListener();
ThreadProcess t1=new ThreadProcess();
JProgressBar pbUndefined;
Form(){
super("Поток-прогрессбар");
j.setLayout(new FlowLayout(FlowLayout.CENTER));
j.setSize(300,300);
j.setResizable(false);
j.setLocationRelativeTo(null);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
model=new DefaultBoundedRangeModel(1,2,0,10);
p=new JProgressBar(model);
j.add(p);
pbUndefined = new JProgressBar(0, 100);
pbUndefined.setStringPainted(true);
pbUndefined.setString("Привет");
j.add((pbUndefined));
b1.setSize(40,30);
b1.addActionListener(bListener);
j.add(b1);
b1.setSize(40,30);
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(j,"Hello");
}
});
j.add(b2);
j.setVisible(true);
}
class ThreadProcess extends Thread {
public void run() {
// Проверка завершения процесса
while ( model.getValue() < model.getMaximum() ) {
try {
// Увеличение текущего значение
model.setValue(model.getValue() + 1);
// Случайная временная задержка
sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class ButtonListener implements ActionListener {
private boolean f=false;
ThreadProcess t=new ThreadProcess();
@Override
public void actionPerformed(ActionEvent e) {
if(!t.isAlive()) {
t = new ThreadProcess();
t.start();
p.setValue(0);
f=true;
}
else {
try {
t.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
f=false;
}
if(pbUndefined.isIndeterminate()) {
pbUndefined.setIndeterminate(false);
}else {
pbUndefined.setIndeterminate(true);
}
}
}
}
public class Test {
public static void main(String[] args) {
new Form();
}
}