//----------------------------------------------------------------------------- // SunTimesPanel.java // // (c) 2004 Jonathan Stott // // Created on 12-Apr-2004 // // 0.2 - 12 Apr 2004 // - Initial Version //----------------------------------------------------------------------------- package uk.me.jstott.sun; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Arrays; import java.util.Calendar; import java.util.TimeZone; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import uk.me.jstott.coordconv.LatitudeLongitude; import uk.me.jstott.util.JulianDateConverter; /** * Panel to provide all the relevant text entry fields in order to allow the * calculation of sunrise, sunset, etc. for a particular latitude and longitude. * The fields are initially populated with today's date and the latitude and * longitude for Canterbury, England. * * For more information on using this class, look at * http://www.jstott.me.uk/jsuntimes/ * * @author Jonathan Stott * @version 0.2 */ public class SunTimesPanel extends JPanel { // Input fields and labels private JTextField northingDegrees = new JTextField("51"); private JTextField northingMinutes = new JTextField("16"); private JTextField northingSeconds = new JTextField("48"); private JTextField eastingDegrees = new JTextField("1"); private JTextField eastingMinutes = new JTextField("4"); private JTextField eastingSeconds = new JTextField("48"); private JLabel northingLabel = new JLabel("Northing"); private JLabel eastingLabel = new JLabel("Easting"); private JLabel northingDegreesLabel = new JLabel("°"); private JLabel northingMinutesLabel = new JLabel("'"); private JLabel northingSecondsLabel = new JLabel("\""); private JLabel eastingDegreesLabel = new JLabel("°"); private JLabel eastingMinutesLabel = new JLabel("'"); private JLabel eastingSecondsLabel = new JLabel("\""); private JLabel dateLabel = new JLabel("Date"); private Calendar date = Calendar.getInstance(); private JTextField dateDay = new JTextField( Integer.toString(date.get(Calendar.DAY_OF_MONTH))); private JComboBox dateMonth = new JComboBox(new String[] {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}); private JTextField dateYear = new JTextField(Integer.toString(date.get(Calendar.YEAR))); private JLabel timeZoneLabel = new JLabel("Time Zone"); private JComboBox timeZones; private JCheckBox daylightSavingsTime = new JCheckBox("Daylight Savings Time", true); // Go button private JButton goButton = new JButton("Go"); // Output fields private JTextField morningAstroTwilight = new JTextField(10); private JTextField morningNauticalTwilight = new JTextField(10); private JTextField morningCivilTwilight = new JTextField(10); private JTextField sunrise = new JTextField(10); private JTextField sunset = new JTextField(10); private JTextField eveningCivilTwilight = new JTextField(10); private JTextField eveningNauticalTwilight = new JTextField(10); private JTextField eveningAstroTwilight = new JTextField(10); // Output labels private JLabel morningAstoTwilightLabel = new JLabel("Morning Astronomical Twilight"); private JLabel morningNauticalTwilightLabel = new JLabel("Morning Nautical Twilight"); private JLabel morningCivilTwilightLabel = new JLabel("Morning Civil Twilight"); private JLabel sunriseLabel = new JLabel("Sunrise"); private JLabel sunsetLabel = new JLabel("Sunset"); private JLabel eveningCivilTwilightLabel = new JLabel("Evening Civil Twilight"); private JLabel eveningNauticalTwilightLabel = new JLabel("Evening Nautical Twilight"); private JLabel eveningAstoTwilightLabel = new JLabel("Evening Astronomical Twilight"); /** * Construct a SunTimesPanel object */ public SunTimesPanel() { super(new BorderLayout()); JPanel inputPanel = new JPanel(new GridLayout(5, 2)); inputPanel.add(northingLabel); JPanel northingPanel = new JPanel(new GridLayout(1, 6)); northingPanel.add(northingDegrees); northingPanel.add(northingDegreesLabel); northingPanel.add(northingMinutes); northingPanel.add(northingMinutesLabel); northingPanel.add(northingSeconds); northingPanel.add(northingSecondsLabel); inputPanel.add(northingPanel); inputPanel.add(eastingLabel); JPanel eastingPanel = new JPanel(new GridLayout(1, 6)); eastingPanel.add(eastingDegrees); eastingPanel.add(eastingDegreesLabel); eastingPanel.add(eastingMinutes); eastingPanel.add(eastingMinutesLabel); eastingPanel.add(eastingSeconds); eastingPanel.add(eastingSecondsLabel); inputPanel.add(eastingPanel); inputPanel.add(dateLabel); JPanel datePanel = new JPanel(new GridLayout(1, 3)); datePanel.add(dateDay); dateMonth.setSelectedIndex(date.get(Calendar.MONTH)); datePanel.add(dateMonth); datePanel.add(dateYear); inputPanel.add(datePanel); inputPanel.add(timeZoneLabel); String[] timeZoneList = TimeZone.getAvailableIDs(); Arrays.sort(timeZoneList); timeZones = new JComboBox(timeZoneList); inputPanel.add(timeZones); inputPanel.add(new JPanel()); inputPanel.add(daylightSavingsTime); JPanel outputPanel = new JPanel(new GridLayout(8,2)); outputPanel.add(morningAstoTwilightLabel); outputPanel.add(morningAstroTwilight); outputPanel.add(morningNauticalTwilightLabel); outputPanel.add(morningNauticalTwilight); outputPanel.add(morningCivilTwilightLabel); outputPanel.add(morningCivilTwilight); outputPanel.add(sunriseLabel); outputPanel.add(sunrise); outputPanel.add(sunsetLabel); outputPanel.add(sunset); outputPanel.add(eveningCivilTwilightLabel); outputPanel.add(eveningCivilTwilight); outputPanel.add(eveningNauticalTwilightLabel); outputPanel.add(eveningNauticalTwilight); outputPanel.add(eveningAstoTwilightLabel); outputPanel.add(eveningAstroTwilight); add(inputPanel, BorderLayout.NORTH); add(goButton, BorderLayout.SOUTH); add(outputPanel, BorderLayout.CENTER); // Listen for clicks on the Go button goButton.addActionListener(new ActionListener() { /** * Respond to clicks on the Go button * * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(ActionEvent e) { // Get all the values from the various text fields int nDay = Integer.parseInt(dateDay.getText()); int nMonth = dateMonth.getSelectedIndex(); int nYear = Integer.parseInt(dateYear.getText()); Calendar cal = Calendar.getInstance(); cal.set(Calendar.DAY_OF_MONTH, nDay); cal.set(Calendar.MONTH, nMonth); cal.set(Calendar.YEAR, nYear); double jd = JulianDateConverter.dateToJulian(cal); int nDeg = Integer.parseInt(northingDegrees.getText()); int nMin = Integer.parseInt(northingMinutes.getText()); int nSec = Integer.parseInt(northingSeconds.getText()); int eDeg = Integer.parseInt(eastingDegrees.getText()); int eMin = Integer.parseInt(eastingMinutes.getText()); int eSec = Integer.parseInt(eastingSeconds.getText()); // Construct the LatitudeLongitude and TimeZone objects LatitudeLongitude ll = new LatitudeLongitude(nDeg, nMin, nSec, eDeg, eMin, eSec); TimeZone timeZone = TimeZone.getTimeZone((String)timeZones.getSelectedItem()); boolean dst = daylightSavingsTime.isSelected(); // Calculate all the relevant Times Time mornATTime = Sun.morningAstronomicalTwilightTime(jd, ll, timeZone, dst); Time mornNTTime = Sun.morningNauticalTwilightTime(jd, ll, timeZone, dst); Time mornCTTime = Sun.morningCivilTwilightTime(jd, ll, timeZone, dst); Time sunriseTime = Sun.sunriseTime(jd, ll, timeZone, dst); Time sunsetTime = Sun.sunsetTime(jd, ll, timeZone, dst); Time evenCTTime = Sun.eveningCivilTwilightTime(jd, ll, timeZone, dst); Time evenNTTime = Sun.eveningNauticalTwilightTime(jd, ll, timeZone, dst); Time evenATTime = Sun.eveningAstronomicalTwilightTime(jd, ll, timeZone, dst); // Display the output in the output fields morningAstroTwilight.setText(mornATTime.toString()); morningNauticalTwilight.setText(mornNTTime.toString()); morningCivilTwilight.setText(mornCTTime.toString()); sunrise.setText(sunriseTime.toString()); sunset.setText(sunsetTime.toString()); eveningAstroTwilight.setText(evenATTime.toString()); eveningNauticalTwilight.setText(evenNTTime.toString()); eveningCivilTwilight.setText(evenCTTime.toString()); } }); } }