79 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
		
		
			
		
	
	
			79 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| 
								 | 
							
								package jpl.test;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * CelsiusConverter.java is a 1.4 application that 
							 | 
						||
| 
								 | 
							
								 * demonstrates the use of JButton, JTextField and
							 | 
						||
| 
								 | 
							
								 * JLabel.  It requires no other files.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								import java.awt.*;
							 | 
						||
| 
								 | 
							
								import java.awt.event.*;
							 | 
						||
| 
								 | 
							
								import javax.swing.*;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public class CelsiusConverter implements ActionListener {
							 | 
						||
| 
								 | 
							
									JFrame		converterFrame;
							 | 
						||
| 
								 | 
							
									JPanel		converterPanel;
							 | 
						||
| 
								 | 
							
									JTextField	tempCelsius;
							 | 
						||
| 
								 | 
							
									JLabel		celsiusLabel, fahrenheitLabel;
							 | 
						||
| 
								 | 
							
									JButton		convertTemp;
							 | 
						||
| 
								 | 
							
									public CelsiusConverter() { // initially locate the window at top-left of desktop
							 | 
						||
| 
								 | 
							
										this(0, 0);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									public CelsiusConverter(int left, int top) { // initially locate the window at top-left of desktop
							 | 
						||
| 
								 | 
							
										// create and set up the window
							 | 
						||
| 
								 | 
							
										converterFrame = new JFrame("Convert Celsius to Fahrenheit");
							 | 
						||
| 
								 | 
							
										converterFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
							 | 
						||
| 
								 | 
							
										converterFrame.setSize(new Dimension(120, 40));
							 | 
						||
| 
								 | 
							
										converterFrame.setLocation(left, top);
							 | 
						||
| 
								 | 
							
										// create and set up the panel
							 | 
						||
| 
								 | 
							
										converterPanel = new JPanel(new GridLayout(2, 2));
							 | 
						||
| 
								 | 
							
										// create widgets
							 | 
						||
| 
								 | 
							
										tempCelsius = new JTextField(2);
							 | 
						||
| 
								 | 
							
										celsiusLabel = new JLabel("Celsius", SwingConstants.LEFT);
							 | 
						||
| 
								 | 
							
										celsiusLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
							 | 
						||
| 
								 | 
							
										//
							 | 
						||
| 
								 | 
							
										convertTemp = new JButton("Convert");
							 | 
						||
| 
								 | 
							
										fahrenheitLabel = new JLabel("Fahrenheit", SwingConstants.LEFT);
							 | 
						||
| 
								 | 
							
										// listen to events from the Convert button
							 | 
						||
| 
								 | 
							
										convertTemp.addActionListener(this);
							 | 
						||
| 
								 | 
							
										// add the widgets to the container
							 | 
						||
| 
								 | 
							
										converterPanel.add(tempCelsius);
							 | 
						||
| 
								 | 
							
										converterPanel.add(celsiusLabel);
							 | 
						||
| 
								 | 
							
										converterPanel.add(convertTemp);
							 | 
						||
| 
								 | 
							
										converterPanel.add(fahrenheitLabel);
							 | 
						||
| 
								 | 
							
										fahrenheitLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
							 | 
						||
| 
								 | 
							
										converterFrame.getRootPane().setDefaultButton(convertTemp); // make "convert" the window's default button
							 | 
						||
| 
								 | 
							
										// add the panel to the window
							 | 
						||
| 
								 | 
							
										converterFrame.getContentPane().add(converterPanel, BorderLayout.CENTER);
							 | 
						||
| 
								 | 
							
										// display the window
							 | 
						||
| 
								 | 
							
										converterFrame.pack();
							 | 
						||
| 
								 | 
							
										converterFrame.setVisible(true);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									public void actionPerformed(ActionEvent event) {
							 | 
						||
| 
								 | 
							
										// parse degrees Celsius as a double
							 | 
						||
| 
								 | 
							
										double tC = (Double.parseDouble(tempCelsius.getText()));
							 | 
						||
| 
								 | 
							
										//
							 | 
						||
| 
								 | 
							
										// convert to Fahrenheit (in Java)
							 | 
						||
| 
								 | 
							
										// int tempFahr = (int) (tC * 1.8 + 32);
							 | 
						||
| 
								 | 
							
										//
							 | 
						||
| 
								 | 
							
										// convert to Fahrenheit (in Prolog, via JPL)
							 | 
						||
| 
								 | 
							
										int tempFahr = ((jpl.Float) jpl.Query.oneSolution("TF is ? * 1.8 + 32", new jpl.Term[] {new jpl.Float(tC)}).get("TF")).intValue();
							 | 
						||
| 
								 | 
							
										//
							 | 
						||
| 
								 | 
							
										// display the result
							 | 
						||
| 
								 | 
							
										fahrenheitLabel.setText(tempFahr + " Fahrenheit");
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									public static void spawnGUI(final int left, final int top) {
							 | 
						||
| 
								 | 
							
										// schedule a job for the event-dispatching thread: create and show an instance of this application at (left,top)
							 | 
						||
| 
								 | 
							
										javax.swing.SwingUtilities.invokeLater(new Runnable() {
							 | 
						||
| 
								 | 
							
											int x = left;
							 | 
						||
| 
								 | 
							
											int y = top;
							 | 
						||
| 
								 | 
							
											public void run() {
							 | 
						||
| 
								 | 
							
												new CelsiusConverter(x, y); // can we be sure this won't be garbage collected?
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										});
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									public static void main(String[] args) {
							 | 
						||
| 
								 | 
							
										// just for fun, we ask Prolog to start five instances of this class (at stepped offsets from top-left of display)
							 | 
						||
| 
								 | 
							
										jpl.Query.allSolutions("between(1, 5, N), X is 10*N, Y is 20*N, jpl_call('jpl.test.CelsiusConverter', spawnGUI, [X,Y], _)");
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |