#format java /** * MediatorPattern example * GUI Login */ import java.awt.*; import java.awt.event.*; interface Mediator { public abstract void createColleagues(); public abstract void colleagueChanged(Colleague colleague); } interface Colleague { public abstract void setMediator(Mediator mediator); public abstract void setColleagueEnabled(boolean enabled); } class ColleagueButton extends Button implements Colleague { private Mediator mediator; public ColleagueButton(String caption) { super(caption); } public void setMediator(Mediator mediator) { this.mediator = mediator; } public void setColleagueEnabled(boolean enabled) { setEnabled(enabled); } } class ColleagueTextField extends TextField implements TextListener, Colleague { private Mediator mediator; public ColleagueTextField(String text, int columns) { super(text, columns); } public void setMediator(Mediator mediator) { this.mediator = mediator; } public void setColleagueEnabled(boolean enabled) { setEnabled(enabled); setBackground(enabled ? Color.white : Color.lightGray); } public void textValueChanged(TextEvent e) { mediator.colleagueChanged(this); } } class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague { private Mediator mediator; public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) { super(caption, group, state); } public void setMediator(Mediator mediator) { this.mediator = mediator; } public void setColleagueEnabled(boolean enabled) { setEnabled(enabled); } public void itemStateChanged(ItemEvent e) { mediator.colleagueChanged(this); } } class LoginFrame extends Frame implements ActionListener, Mediator { private ColleagueCheckbox checkGuest; private ColleagueCheckbox checkLogin; private ColleagueTextField textUser; private ColleagueTextField textPass; private ColleagueButton buttonOk; private ColleagueButton buttonCancel; // Constructor: create Colleagues, position, display public LoginFrame(String title) { super(title); setBackground(Color.lightGray); setLayout(new GridLayout(4,2)); // create and position createColleagues(); add(checkGuest); add(checkLogin); add(new Label("Username:")); add(textUser); add(new Label("Password:")); add(textPass); add(buttonOk); add(buttonCancel); // enabled initial setting and display colleagueChanged(checkGuest); pack(); show(); } public void createColleagues() { CheckboxGroup g = new CheckboxGroup(); checkGuest = new ColleagueCheckbox("Guest",g,true); checkLogin = new ColleagueCheckbox("Login",g,false); textUser = new ColleagueTextField("",10); textPass = new ColleagueTextField("",10); textPass.setEchoChar('*'); buttonOk = new ColleagueButton("OK"); buttonCancel = new ColleagueButton("Cancel"); // Mediator setting checkGuest.setMediator(this); checkLogin.setMediator(this); textUser.setMediator(this); textPass.setMediator(this); buttonOk.setMediator(this); buttonCancel.setMediator(this); // Listener setting checkGuest.addItemListener(checkGuest); checkLogin.addItemListener(checkLogin); textUser.addTextListener(textUser); textPass.addTextListener(textPass); buttonOk.addActionListener(this); buttonCancel.addActionListener(this); } public void colleagueChanged(Colleague c) { if(c == checkGuest || c == checkLogin) { if(checkGuest.getState()) { // Guest mode textUser.setColleagueEnabled(false); textPass.setColleagueEnabled(false); buttonOk.setColleagueEnabled(true); } else { textUser.setColleagueEnabled(true); userpassChanged(); } } else if(c == textUser || c == textPass) { userpassChanged(); } else { System.out.println("colleagueChanged:unknown colleague ="+c); } } private void userpassChanged() { if(textUser.getText().length() > 0) { textPass.setColleagueEnabled(true); if(textPass.getText().length() > 0) { buttonOk.setColleagueEnabled(true); } else { buttonOk.setColleagueEnabled(false); } } else { textPass.setColleagueEnabled(false); buttonOk.setColleagueEnabled(false); } } public void actionPerformed(ActionEvent e) { System.out.println(""+e); System.exit(0); } } public class MediatorGuiLogin { public static void main(String[] args) { new LoginFrame("Mediator Sample"); } }