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();
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д