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