SWT(JFace)体验之ApplicationWindow时间:2021-12-09 08:39:31测试代码如下: package swt_jface.demo; import org.eclipse.jface.window.ApplicationWindow; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; public class TemperatureConverterJFace extends ApplicationWindow { Label fahrenheitLabel; Label celsiusLabel; Text fahrenheitValue; Text celsiusValue; public TemperatureConverterJFace() { super(null); addStatusLine(); } protected Control createContents(Composite parent) { getShell().setText("JFace Temperature Converter"); Composite converterComposite = new Composite(parent, SWT.NULL); converterComposite.setLayout(new GridLayout(4, false)); fahrenheitLabel = new Label(converterComposite, SWT.NULL); fahrenheitLabel.setText("Fahrenheit: "); fahrenheitValue = new Text(converterComposite, SWT.SINGLE | SWT.BORDER); celsiusLabel = new Label(converterComposite, SWT.NULL); celsiusLabel.setText("Celsius: "); celsiusValue = new Text(converterComposite, SWT.SINGLE | SWT.BORDER); ModifyListener listener = new ModifyListener() { public void modifyText(ModifyEvent e) { valueChanged((Text) e.widget); } }; fahrenheitValue.addModifyListener(listener); celsiusValue.addModifyListener(listener); return converterComposite; } public void valueChanged(Text text) { if (!text.isFocusControl()) return; if (text == fahrenheitValue) { try { double fValue = Double.parseDouble(text.getText()); double cValue = (fValue - 32) / 1.8; celsiusValue.setText(Double.toString(cValue)); System.out.println("F -> C: " + cValue); setStatus("Conversion performed successfully."); } catch (NumberFormatException e) { celsiusValue.setText(""); setStatus("Invalid number format: " + text.getText()); } } else { try { double cValue = Double.parseDouble(text.getText()); double fValue = cValue * 1.8 + 32; fahrenheitValue.setText(Double.toString(fValue)); System.out.println("C -> F: " + fValue); setStatus("Conversion performed successfully."); } catch (NumberFormatException e) { fahrenheitValue.setText(""); setStatus("Invalid number format: " + text.getText()); } } } public static void main(String[] args) { TemperatureConverterJFace converter = new TemperatureConverterJFace(); converter.setBlockOnOpen(true); converter.open(); Display.getCurrent().dispose(); } } ========================================================== 不使用ApplicationWindow(即只是用SWT类)的解决方案: package swt_jface.demo; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; public class TemperatureConverter { Display display = new Display(); Shell shell = new Shell(display); Label fahrenheitLabel; Label celsiusLabel; Label messageLabel; Text fahrenheitValue; Text celsiusValue; public TemperatureConverter() { shell.setText("SWT Temperature Converter"); shell.setLayout(new GridLayout(4, false)); fahrenheitLabel = new Label(shell, SWT.NULL); fahrenheitLabel.setText("Fahrenheit: "); fahrenheitValue = new Text(shell, SWT.SINGLE | SWT.BORDER); celsiusLabel = new Label(shell, SWT.NULL); celsiusLabel.setText("Celsius: "); celsiusValue = new Text(shell, SWT.SINGLE | SWT.BORDER); messageLabel = new Label(shell, SWT.BORDER); GridData gridData = new GridData(GridData.FILL_BOTH); gridData.horizontalSpan = 4; messageLabel.setLayoutData(gridData); ModifyListener listener = new ModifyListener() { public void modifyText(ModifyEvent e) { valueChanged((Text) e.widget); } }; fahrenheitValue.addModifyListener(listener); celsiusValue.addModifyListener(listener); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } public void valueChanged(Text text) { if (!text.isFocusControl()) return; if (text == fahrenheitValue) { try { double fValue = Double.parseDouble(text.getText()); double cValue = (fValue - 32) / 1.8; celsiusValue.setText(Double.toString(cValue)); System.out.println("F -> C: " + cValue); messageLabel.setText("Conversion performed successfully."); } catch (NumberFormatException e) { celsiusValue.setText(""); messageLabel.setText("Invalid number format: " + text.getText()); } } else { try { double cValue = Double.parseDouble(text.getText()); double fValue = cValue * 1.8 + 32; fahrenheitValue.setText(Double.toString(fValue)); System.out.println("C -> F: " + fValue); messageLabel.setText("Conversion performed successfully."); } catch (NumberFormatException e) { fahrenheitValue.setText(""); messageLabel.setText("Invalid number format: " + text.getText()); } } } public static void main(String[] args) { new TemperatureConverter(); } }