Java tutorial
//Send questions, comments, bug reports, etc. to the authors: //Rob Warner (rwarner@interspatial.com) //Robert Harris (rbrt_harris@yahoo.com) import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; /** * This class demonstrates various listeners */ public class MultipleListenersExample implements HelpListener, VerifyListener, ModifyListener { // Constants used for conversions private static final double FIVE_NINTHS = 5.0 / 9.0; private static final double NINE_FIFTHS = 9.0 / 5.0; // Widgets used in the window private Text fahrenheit; private Text celsius; private Label help; /** * Runs the application */ public void run() { Display display = new Display(); Shell shell = new Shell(display); shell.setText("Temperatures"); createContents(shell); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } /** * Create the main window's contents * @param shell the main window */ private void createContents(Shell shell) { shell.setLayout(new GridLayout(3, true)); // Create the label and input box for Fahrenheit new Label(shell, SWT.LEFT).setText("Fahrenheit:"); fahrenheit = new Text(shell, SWT.BORDER); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 2; fahrenheit.setLayoutData(data); // Set the context-sensitive help fahrenheit.setData("Type a temperature in Fahrenheit"); // Add the listeners fahrenheit.addHelpListener(this); fahrenheit.addVerifyListener(this); fahrenheit.addModifyListener(this); // Create the label and input box for Celsius new Label(shell, SWT.LEFT).setText("Celsius:"); celsius = new Text(shell, SWT.BORDER); data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 2; celsius.setLayoutData(data); // Set the context-sensitive help celsius.setData("Type a temperature in Celsius"); // Add the listeners celsius.addHelpListener(this); celsius.addVerifyListener(this); celsius.addModifyListener(this); // Create the area for help help = new Label(shell, SWT.LEFT | SWT.BORDER); data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 3; help.setLayoutData(data); } /** * Called when user requests help */ public void helpRequested(HelpEvent event) { // Get the help text from the widget and set it into the help label help.setText((String) event.widget.getData()); } /** * Called when the user types into a text box, but before the text box gets * what the user typed */ public void verifyText(VerifyEvent event) { // Assume we don't allow it event.doit = false; // Get the character typed char myChar = event.character; String text = ((Text) event.widget).getText(); // Allow '-' if first character if (myChar == '-' && text.length() == 0) event.doit = true; // Allow 0-9 if (Character.isDigit(myChar)) event.doit = true; // Allow backspace if (myChar == '\b') event.doit = true; } /** * Called when the user modifies the text in a text box */ public void modifyText(ModifyEvent event) { // Remove all the listeners, so we don't enter any infinite loops celsius.removeVerifyListener(this); celsius.removeModifyListener(this); fahrenheit.removeVerifyListener(this); fahrenheit.removeModifyListener(this); // Get the widget whose text was modified Text text = (Text) event.widget; try { // Get the modified text int temp = Integer.parseInt(text.getText()); // If they modified fahrenheit, convert to Celsius if (text == fahrenheit) { celsius.setText(String.valueOf((int) (FIVE_NINTHS * (temp - 32)))); } else { // Convert to fahrenheit fahrenheit.setText(String.valueOf((int) (NINE_FIFTHS * temp + 32))); } } catch (NumberFormatException e) { /* Ignore */ } // Add the listeners back celsius.addVerifyListener(this); celsius.addModifyListener(this); fahrenheit.addVerifyListener(this); fahrenheit.addModifyListener(this); } /** * The application entry point * @param args the command line arguments */ public static void main(String[] args) { new MultipleListenersExample().run(); } }