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();
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.455 из 5