package plp.sort; import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class WinTracer extends JFrame implements Observer { SortableData data; JLabel [] labels; JSlider slider; Observable observable; private static final String [] ACTION_NAMES = { SortableDataTracer.COMPARE_NAME, SortableDataTracer.ACCESS_NAME, SortableDataTracer.SWAP_NAME }; private static final Color [] ACTION_COLORS = {Color.red, Color.yellow, Color.blue}; private static final Color NORMAL_COLOR = Color.black; private static final Color LABELS_BG = Color.white; public WinTracer(Observable observable, SortableData data) { super("Sort"); this.data = data; this.observable = observable; setDefaultCloseOperation(DISPOSE_ON_CLOSE); final WinTracer tracer = this; addWindowListener(new WindowAdapter() { public void windowClosed(WindowEvent e) { tracer.observable.deleteObserver(tracer); // Plug-out the observer } }); JPanel mainPane = new JPanel(new BorderLayout()); JPanel labelsPane = new JPanel(); labelsPane.setLayout(new FlowLayout(5)); labelsPane.setBackground(LABELS_BG); labelsPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); labels = new JLabel[data.length()]; for (int i = 0; i < data.length(); ++i) { labels[i] = new JLabel(); labels[i].setForeground(NORMAL_COLOR); labelsPane.add(labels[i]); labels[i].setText(data.access(i).toString()); } mainPane.add(labelsPane, BorderLayout.NORTH); slider = new JSlider(); mainPane.add(slider, BorderLayout.SOUTH); setContentPane(mainPane); pack(); setVisible(true); } public void update(Observable o, Object arg) { SortableDataTracer.Operation op = (SortableDataTracer.Operation) arg; int [] indices = op.indices(); for (int i = 0; i < ACTION_NAMES.length; ++i) { if (op.name().equals(ACTION_NAMES[i])) { for (int j = 0; j < indices.length; ++j) { labels[indices[j]].setForeground(ACTION_COLORS[i]); } break; } } if (op.name().equals(SortableDataTracer.SWAP_NAME)) { String tmp = labels[indices[0]].getText(); labels[indices[0]].setText(labels[indices[1]].getText()); labels[indices[1]].setText(tmp); } for (int i = 0; i < slider.getValue() * 100000; i++) ; for (int i = 0; i < indices.length; ++i) { labels[indices[i]].setForeground(NORMAL_COLOR); } } }