/** * class that can answer to the maing question * @author __nocach */ public class MeaningOfLifeAnswerer { public int answer(){ return 42; } }
/** * worker that prepares MeaningOfLifeAnswerer * @author __nocach */ public class PrepareToAnswerMeaningOfLife extends SwingWorker<MeaningOfLifeAnswerer, Void>{ @Override protected MeaningOfLifeAnswerer doInBackground() throws Exception { Thread.sleep(1500); return new MeaningOfLifeAnswerer(); } }
/** * worker that will retrieve answer to the main question using passed Answerer * @author __nocach */ public class RetrieveMeaningOfLife extends SwingWorker<Integer, Integer>{ private final MeaningOfLifeAnswerer answerer; public RetrieveMeaningOfLife(MeaningOfLifeAnswerer answerer){ if (answerer == null){ throw new NullPointerException("prepareProvider can't be null"); } this.answerer = answerer; } @Override protected Integer doInBackground() throws Exception { for(int i = 0; i < 100; i++){ Thread.sleep(10); setProgress(i); } return answerer.answer(); } }
public class StandardWay extends javax.swing.JFrame { private Logger logger = Logger.getLogger(StandardWay.class.getName()); private class FindAnswerAction extends AbstractAction{ private final MeaningOfLifeAnswerer answerer; public FindAnswerAction(MeaningOfLifeAnswerer answerer){ super("Find"); this.answerer = answerer; } @Override public void actionPerformed(ActionEvent e) { RetrieveMeaningOfLife retrieveWorker = new RetrieveMeaningOfLife(answerer); retrieveWorker.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ("progress".equals(evt.getPropertyName())){ progressBar.setValue((Integer)evt.getNewValue()); } if ("state".equals(evt.getPropertyName())){ if (StateValue.STARTED.equals(evt.getNewValue())){ // doButton.setText("In Search"); doButton.setEnabled(false); labelStatus.setText("searching..."); } if (StateValue.DONE.equals(evt.getNewValue())){ RetrieveMeaningOfLife worker = (RetrieveMeaningOfLife)evt.getSource(); try{ Integer answer = worker.get(); // logger.info("got the answer"); JOptionPane.showMessageDialog(rootPane, "THE ANSWER IS " + answer); } catch(Exception ex){ // logger.info("error while retrieving the answer"); JOptionPane.showMessageDialog(rootPane, "Error while searching for meaning of life"); } labelStatus.setText("answer was found"); doButton.setText("Find again"); doButton.setEnabled(true); } } } }); retrieveWorker.execute(); } } /** * listener that updates gui state by progress of PrepareToAnswerMeaningOfLife worker * @author __nocach * */ private class PrepareToAnswerMeaningOfLifeListener implements PropertyChangeListener{ @Override public void propertyChange(PropertyChangeEvent evt) { if ("state".equals(evt.getPropertyName())){ if (StateValue.STARTED.equals(evt.getNewValue())){ // MeaningOfLifeAnswerer labelStatus.setText("Prepearing... "); doButton.setEnabled(false); logger.info("preparing..."); } if (StateValue.DONE.equals(evt.getNewValue())){ // labelStatus.setText("I am prepared to answer the meaning of life"); doButton.setEnabled(true); PrepareToAnswerMeaningOfLife worker = (PrepareToAnswerMeaningOfLife)evt.getSource(); try{ doButton.setAction(new FindAnswerAction(worker.get())); logger.info("prepared"); } catch(Exception ex){ // MeaningOfLifeAnswerer JOptionPane.showMessageDialog(rootPane, "failed to find answerer to the question"); dispose(); logger.severe("failed to prepare"); } } } } } /** Creates new form StandardWay */ public StandardWay() { initComponents(); PrepareToAnswerMeaningOfLife prepareWorker = new PrepareToAnswerMeaningOfLife(); prepareWorker.addPropertyChangeListener(new PrepareToAnswerMeaningOfLifeListener()); prepareWorker.execute(); } //... // JFrame //... private javax.swing.JButton doButton; private javax.swing.JLabel labelStatus; private javax.swing.JProgressBar progressBar; }
private void setViewToPreparing(){ labelStatus.setText("Prepearing... "); doButton.setEnabled(false); logger.info("preparing..."); }
public class StateMachineWay extends javax.swing.JFrame { private Logger logger = Logger.getLogger(StandardWay.class.getName()); /** * controlls switching between gui states */ private GuiStateManager stateManager = new GuiStateManager(); private class PreparingAnswererState extends BaseGuiState{ @Override public void enterState() { labelStatus.setText("Prepearing... "); doButton.setEnabled(false); } } private class ReadyToFindTheAnswer extends BaseGuiState{ private final MeaningOfLifeAnswerer answerer; public ReadyToFindTheAnswer(MeaningOfLifeAnswerer answerer){ this.answerer = answerer; } @Override public void enterState() { labelStatus.setText("I am prepared to answer the meaning of life"); doButton.setEnabled(true); doButton.setAction(new FindAnswerAction(answerer)); } } private class FoundAnswerState extends BaseGuiState{ private final Integer answer; public FoundAnswerState(Integer answer){ this.answer = answer; } @Override public void enterState() { labelStatus.setText("answer was found"); doButton.setText("Find again"); doButton.setEnabled(true); JOptionPane.showMessageDialog(rootPane, "THE ANSWER IS " + answer); } } private class FailedToPrepareAnswerer extends BaseGuiState{ @Override public void enterState() { JOptionPane.showMessageDialog(rootPane, "failed to find answerer to the question"); dispose(); } } private class FailedToFoundAnswer extends BaseGuiState{ @Override public void enterState() { labelStatus.setText("failed to find answer"); doButton.setText("Try again"); doButton.setEnabled(true); JOptionPane.showMessageDialog(rootPane, "Error while searching for meaning of life"); } } private class SearchingForAnswer extends BaseGuiState{ @Override public void enterState() { labelStatus.setText("searching..."); doButton.setText("In Search"); doButton.setEnabled(false); } } /** * actions that starts worker that will find the answer to the main question * @author __nocach * */ private class FindAnswerAction extends AbstractAction{ private final MeaningOfLifeAnswerer answerer; public FindAnswerAction(MeaningOfLifeAnswerer answerer){ super("Find"); this.answerer = answerer; } @Override public void actionPerformed(ActionEvent e) { RetrieveMeaningOfLife retrieveWorker = new RetrieveMeaningOfLife(answerer); retrieveWorker.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ("progress".equals(evt.getPropertyName())){ progressBar.setValue((Integer)evt.getNewValue()); } if ("state".equals(evt.getPropertyName())){ if (StateValue.DONE.equals(evt.getNewValue())){ RetrieveMeaningOfLife worker = (RetrieveMeaningOfLife)evt.getSource(); try{ Integer answer = worker.get(); stateManager.switchTo(new FoundAnswerState(answer)); logger.info("got the answer"); } catch(Exception ex){ logger.info("error while retrieving the answer"); stateManager.switchTo(new FailedToFoundAnswer()); } } if (StateValue.STARTED.equals(evt.getNewValue())){ stateManager.switchTo(new SearchingForAnswer()); } } } }); retrieveWorker.execute(); } } /** * listener that updates gui state by progress of PrepareToAnswerMeaningOfLife worker * @author __nocach * */ private class PrepareToAnswerMeaningOfLifeListener implements PropertyChangeListener{ @Override public void propertyChange(PropertyChangeEvent evt) { if ("state".equals(evt.getPropertyName())){ if (StateValue.STARTED.equals(evt.getNewValue())){ logger.info("preparing..."); stateManager.switchTo(new PreparingAnswererState()); } if (StateValue.DONE.equals(evt.getNewValue())){ PrepareToAnswerMeaningOfLife worker = (PrepareToAnswerMeaningOfLife)evt.getSource(); try{ MeaningOfLifeAnswerer meaningOfLifeAnswerer = worker.get(); stateManager.switchTo(new ReadyToFindTheAnswer(meaningOfLifeAnswerer)); logger.info("prepared"); } catch(Exception ex){ logger.severe("failed to prepare"); stateManager.switchTo(new FailedToPrepareAnswerer()); } } } } } /** Creates new form StandardWay */ public StateMachineWay() { initComponents(); PrepareToAnswerMeaningOfLife prepareWorker = new PrepareToAnswerMeaningOfLife(); prepareWorker.addPropertyChangeListener(new PrepareToAnswerMeaningOfLifeListener()); prepareWorker.execute(); } //... // JFrame //... private javax.swing.JButton doButton; private javax.swing.JLabel labelStatus; private javax.swing.JProgressBar progressBar; }
/** * State machine of swing gui * @author __nocach */ public class GuiStateManager { private GuiState currentState = new EmptyState(); /** * makes passed state current * @param newState not null new state */ public synchronized void switchTo(GuiState newState){ if (newState == null){ throw new NullPointerException(); } currentState.leaveState(); currentState = newState; currentState.enterState(); } public GuiState current(){ return currentState; } }
public interface GuiState { /** * called when entering to this state */ public void enterState(); /** * called when leaving this state */ public void leaveState(); }
stateManager.switchTo(new ReadyToFindTheAnswer(meaningOfLifeAnswerer));
Source: https://habr.com/ru/post/130256/
All Articles