source: tmcsimulator/trunk/src/tmcsim/cadsimulator/managers/TrafficModelViewer.java @ 206

Revision 206, 14.7 KB checked in by jdalbey, 9 years ago (diff)

TrafficModelManager?.java Refactor to use Observable, along with the view. Add Reload button functionality.

Line 
1package tmcsim.cadsimulator.managers;
2
3import tmcsim.client.*;
4import atmsdriver.model.TrafficEvent;
5import java.text.ParseException;
6import java.util.ArrayList;
7import java.util.LinkedList;
8import java.util.List;
9import java.util.Observable;
10import java.util.Observer;
11import java.util.Vector;
12import java.util.logging.Level;
13import java.util.logging.Logger;
14import javax.swing.AbstractListModel;
15import javax.swing.JOptionPane;
16
17/**
18 * GUI for the Traffic Model Manager.
19 * @author jdalbey
20 */
21public class TrafficModelViewer extends javax.swing.JFrame implements Observer
22{
23
24    /**
25     * Reference to the driver associated with this GUI
26     */
27    private TrafficModelManager driver;
28    private List<String> incidents;
29
30    /**
31     * Creates new form ATMSBatchViewer.
32     *
33     * @param incidents a list of incidents to show in a list.
34     */
35    public TrafficModelViewer(TrafficModelManager driver)
36    {
37        initComponents();
38        this.driver = driver;
39            txtClockTime.setText(driver.getClockTime());
40            lstIncidents.setListData(driver.getIncidents());
41            lstEvents.setModel(new MyListModel(driver.getEventQueue()));
42       
43//        this.incidents = incidentList;
44//        lstIncidents.setModel(new javax.swing.AbstractListModel<String>()
45//        {
46//            public int getSize()
47//            {
48//                return incidents.size();
49//            }
50//
51//            public String getElementAt(int i)
52//            {
53//                return incidents.get(i);
54//            }
55//        });
56    }
57
58//    public void update(String currentTime, String atmsTime, List<TrafficEvent> events)
59//    {
60//        lstEvents.setModel(new MyListModel(events));
61//        txtClockTime.setText(currentTime + " / " + atmsTime);
62//    }
63
64    @Override
65    public void update(Observable obs, Object obj)
66    {
67        if (obj == null) return;
68        if (obj instanceof String)
69        {
70            String currentTime = (String) obj;
71            txtClockTime.setText(currentTime);
72        }
73        if (obj instanceof Vector)
74        {
75            lstIncidents.setListData((Vector)obj);
76        }
77        if (obj instanceof LinkedList)
78        {
79            lstEvents.setModel(new MyListModel((LinkedList)obj));
80        }
81    }
82
83    class MyListModel extends AbstractListModel<String>
84    {
85
86        TrafficEvent[] strings;// = { "item 1", "item 2" };
87
88        public MyListModel(List<TrafficEvent> events)
89        {
90            strings = events.toArray(new TrafficEvent[events.size()]);
91        }
92
93        public int getSize()
94        {
95            return strings.length;
96        }
97
98        public String getElementAt(int i)
99        {
100            return strings[i].rawString;
101        }
102    }
103
104    /**
105     * This method is called from within the constructor to initialize the form.
106     * WARNING: Do NOT modify this code. The content of this method is always
107     * regenerated by the Form Editor.
108     */
109    @SuppressWarnings("unchecked")
110    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
111    private void initComponents()
112    {
113
114        pnlEvents = new javax.swing.JPanel();
115        scrollEvents = new javax.swing.JScrollPane();
116        lstEvents = new javax.swing.JList<>();
117        txtClockTime = new javax.swing.JLabel();
118        btnReload = new javax.swing.JButton();
119        pnlIncidents = new javax.swing.JPanel();
120        jScrollPane1 = new javax.swing.JScrollPane();
121        lstIncidents = new javax.swing.JList<>();
122        btnClear = new javax.swing.JButton();
123
124        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
125        setTitle("Traffic Modeler");
126
127        lstEvents.setFont(new java.awt.Font("Noto Mono", 0, 12)); // NOI18N
128        lstEvents.setModel(new javax.swing.AbstractListModel<String>()
129        {
130            String[] strings = { "item 1", "item 2" };
131            public int getSize() { return strings.length; }
132            public String getElementAt(int i) { return strings[i]; }
133        });
134        scrollEvents.setViewportView(lstEvents);
135
136        txtClockTime.setFont(new java.awt.Font("Noto Sans", 1, 14)); // NOI18N
137        txtClockTime.setText("0:00:00");
138
139        btnReload.setText("Reload");
140        btnReload.addActionListener(new java.awt.event.ActionListener()
141        {
142            public void actionPerformed(java.awt.event.ActionEvent evt)
143            {
144                btnReloadActionPerformed(evt);
145            }
146        });
147
148        javax.swing.GroupLayout pnlEventsLayout = new javax.swing.GroupLayout(pnlEvents);
149        pnlEvents.setLayout(pnlEventsLayout);
150        pnlEventsLayout.setHorizontalGroup(
151            pnlEventsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
152            .addGroup(pnlEventsLayout.createSequentialGroup()
153                .addContainerGap()
154                .addComponent(scrollEvents, javax.swing.GroupLayout.PREFERRED_SIZE, 430, javax.swing.GroupLayout.PREFERRED_SIZE)
155                .addContainerGap(20, Short.MAX_VALUE))
156            .addGroup(pnlEventsLayout.createSequentialGroup()
157                .addGap(112, 112, 112)
158                .addComponent(txtClockTime, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE)
159                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
160                .addComponent(btnReload)
161                .addGap(32, 32, 32))
162        );
163        pnlEventsLayout.setVerticalGroup(
164            pnlEventsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
165            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlEventsLayout.createSequentialGroup()
166                .addGroup(pnlEventsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
167                    .addComponent(txtClockTime, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
168                    .addComponent(btnReload))
169                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
170                .addComponent(scrollEvents, javax.swing.GroupLayout.DEFAULT_SIZE, 172, Short.MAX_VALUE)
171                .addContainerGap())
172        );
173
174        lstIncidents.setFont(new java.awt.Font("Noto Mono", 0, 15)); // NOI18N
175        lstIncidents.setModel(new javax.swing.AbstractListModel<String>()
176        {
177            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
178            public int getSize() { return strings.length; }
179            public String getElementAt(int i) { return strings[i]; }
180        });
181        lstIncidents.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
182        jScrollPane1.setViewportView(lstIncidents);
183
184        btnClear.setText("Clear Incident");
185        btnClear.addActionListener(new java.awt.event.ActionListener()
186        {
187            public void actionPerformed(java.awt.event.ActionEvent evt)
188            {
189                btnClearActionPerformed(evt);
190            }
191        });
192
193        javax.swing.GroupLayout pnlIncidentsLayout = new javax.swing.GroupLayout(pnlIncidents);
194        pnlIncidents.setLayout(pnlIncidentsLayout);
195        pnlIncidentsLayout.setHorizontalGroup(
196            pnlIncidentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
197            .addGroup(pnlIncidentsLayout.createSequentialGroup()
198                .addGroup(pnlIncidentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
199                    .addComponent(btnClear)
200                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 211, javax.swing.GroupLayout.PREFERRED_SIZE))
201                .addGap(0, 0, Short.MAX_VALUE))
202        );
203        pnlIncidentsLayout.setVerticalGroup(
204            pnlIncidentsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
205            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlIncidentsLayout.createSequentialGroup()
206                .addContainerGap()
207                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 179, javax.swing.GroupLayout.PREFERRED_SIZE)
208                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
209                .addComponent(btnClear)
210                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
211        );
212
213        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
214        getContentPane().setLayout(layout);
215        layout.setHorizontalGroup(
216            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
217            .addGroup(layout.createSequentialGroup()
218                .addGap(1, 1, 1)
219                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
220                    .addGroup(layout.createSequentialGroup()
221                        .addGap(12, 12, 12)
222                        .addComponent(pnlIncidents, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
223                    .addComponent(pnlEvents, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
224                .addGap(0, 26, Short.MAX_VALUE))
225        );
226        layout.setVerticalGroup(
227            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
228            .addGroup(layout.createSequentialGroup()
229                .addComponent(pnlEvents, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
230                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
231                .addComponent(pnlIncidents, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
232                .addContainerGap())
233        );
234
235        pack();
236    }// </editor-fold>//GEN-END:initComponents
237
238    private void btnClearActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btnClearActionPerformed
239    {//GEN-HEADEREND:event_btnClearActionPerformed
240        String selectedItem = lstIncidents.getSelectedValue();
241        if (selectedItem == null)
242        {
243            JOptionPane.showMessageDialog(this, "No Incident Selected", "Warning", JOptionPane.INFORMATION_MESSAGE);
244        }
245        else
246        {
247            System.out.println("Clicked Incident:" + selectedItem);
248            if (driver != null)
249            {
250                driver.clearIncident(selectedItem);
251            }
252            lstIncidents.clearSelection();
253            // Remove selectedItem from list model;
254//            incidents.remove(selectedItem);
255            // Update the list displayed
256//            String[] array = new String[incidents.size()];
257//            array = incidents.toArray(array);
258//            lstIncidents.setListData(array);
259        }
260    }//GEN-LAST:event_btnClearActionPerformed
261
262    private void btnReloadActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btnReloadActionPerformed
263    {//GEN-HEADEREND:event_btnReloadActionPerformed
264        String message = "Reload will delete all events in the queue and reload the events file.";
265        String title = "Please Confirm";
266        // display the JOptionPane showConfirmDialog
267        int reply = JOptionPane.showConfirmDialog(this, message, title, JOptionPane.YES_NO_OPTION);
268        if (reply == JOptionPane.YES_OPTION)
269        {
270            driver.loadEvents();
271        }
272    }//GEN-LAST:event_btnReloadActionPerformed
273   
274    /**
275     * @param args the command line arguments
276     */
277    public static void main(String args[])
278    {
279        /* Set the Nimbus look and feel */
280        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
281        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
282         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
283         */
284        try
285        {
286            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels())
287            {
288                if ("Nimbus".equals(info.getName()))
289                {
290                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
291                    break;
292                }
293            }
294        }
295        catch (ClassNotFoundException ex)
296        {
297            java.util.logging.Logger.getLogger(TrafficModelViewer.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
298        }
299        catch (InstantiationException ex)
300        {
301            java.util.logging.Logger.getLogger(TrafficModelViewer.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
302        }
303        catch (IllegalAccessException ex)
304        {
305            java.util.logging.Logger.getLogger(TrafficModelViewer.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
306        }
307        catch (javax.swing.UnsupportedLookAndFeelException ex)
308        {
309            java.util.logging.Logger.getLogger(TrafficModelViewer.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
310        }
311        //</editor-fold>
312        //</editor-fold>
313        //</editor-fold>
314        //</editor-fold>
315
316        /* Create and display the form */
317        java.awt.EventQueue.invokeLater(new Runnable()
318        {
319            public void run()
320            {
321                try
322                {
323                    TrafficEvent alpha = new TrafficEvent("181 00:01:30 405 S 0.6 11.0 G");
324                    TrafficEvent beta = new TrafficEvent("183 00:12:30 405 S 0.6 11.0 G");
325                    TrafficEvent charly = new TrafficEvent("181 00:22:00 5 S 0.6 11.0 G");
326                    LinkedList<TrafficEvent> sample = new LinkedList<TrafficEvent>();
327                    sample.add(alpha);
328                    sample.add(beta);
329                    List<String> items = new ArrayList<String>();
330                    items.add("180");
331                    items.add("1291");
332                    TrafficModelViewer view = new TrafficModelViewer(null);
333                    view.setVisible(true);
334                    //view.update("01", "02", sample);
335                }
336                catch (ParseException ex)
337                {
338                    Logger.getLogger(TrafficModelViewer.class.getName()).log(Level.SEVERE, null, ex);
339                }
340
341            }
342        });
343    }
344
345    // Variables declaration - do not modify//GEN-BEGIN:variables
346    private javax.swing.JButton btnClear;
347    private javax.swing.JButton btnReload;
348    private javax.swing.JScrollPane jScrollPane1;
349    private javax.swing.JList<String> lstEvents;
350    private javax.swing.JList<String> lstIncidents;
351    private javax.swing.JPanel pnlEvents;
352    private javax.swing.JPanel pnlIncidents;
353    private javax.swing.JScrollPane scrollEvents;
354    private javax.swing.JLabel txtClockTime;
355    // End of variables declaration//GEN-END:variables
356}
Note: See TracBrowser for help on using the repository browser.