diff --git a/cs621/proj4/KnightsTour.java b/cs621/proj4/KnightsTour.java index 212c2d1..1d7498c 100644 --- a/cs621/proj4/KnightsTour.java +++ b/cs621/proj4/KnightsTour.java @@ -8,6 +8,7 @@ import javax.swing.border.*; public class KnightsTour extends JFrame { private KnightsTourBoard m_ktBoard = new KnightsTourBoard(5, 5); + private Thread m_tourThread; /* GUI elements */ private ActionEventHandler m_handler = new ActionEventHandler(this); @@ -16,6 +17,7 @@ public class KnightsTour extends JFrame private JTextField m_startXField; private JTextField m_startYField; private JButton m_startButton; + private JButton m_cancelButton; private JPanel m_mainPanel; private JPanel m_boardPanel; private JLabel m_statusLabel; @@ -67,6 +69,9 @@ public class KnightsTour extends JFrame setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); add(m_startButton = new JButton("Start Knight's Tour")); m_startButton.addActionListener(m_handler); + add(m_cancelButton = new JButton("Cancel Knight's Tour")); + m_cancelButton.addActionListener(m_handler); + m_cancelButton.setVisible(false); add(new Box.Filler(new Dimension(0, 4), new Dimension(0, 4), new Dimension(0, 4))); @@ -91,9 +96,9 @@ public class KnightsTour extends JFrame JPanel oldBoardPanel = m_boardPanel; m_boardPanel = new JPanel(new GridLayout(height, width, 1, 1)); m_boardPanel.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); - for (int x = 0; x < width; x++) + for (int y = 0; y < height; y++) { - for (int y = 0; y < height; y++) + for (int x = 0; x < width; x++) { JLabel l = new JLabel(m_ktBoard.getStepAt(x, y) == 0 ? "" @@ -147,9 +152,22 @@ public class KnightsTour extends JFrame createBoardPanel(); /* run the tour in a separate thread */ - m_startButton.setEnabled(false); + m_startButton.setVisible(false); + m_cancelButton.setVisible(true); - new Thread(new TourThread(startx, starty)).start(); + m_tourThread = new Thread(new TourThread(startx, starty)); + m_tourThread.start(); + } + else if (e.getSource() == m_cancelButton) + { + if (m_tourThread != null) + { + m_tourThread.stop(); + m_tourThread = null; + m_startButton.setVisible(true); + m_cancelButton.setVisible(false); + m_statusLabel.setText("Cancelled."); + } } } } @@ -173,7 +191,8 @@ public class KnightsTour extends JFrame { createBoardPanel(); m_statusLabel.setText("Finished."); - m_startButton.setEnabled(true); + m_startButton.setVisible(true); + m_cancelButton.setVisible(false); } }); } @@ -184,10 +203,12 @@ public class KnightsTour extends JFrame { createBoardPanel(); m_statusLabel.setText("Solution not found!"); - m_startButton.setEnabled(true); + m_startButton.setVisible(true); + m_cancelButton.setVisible(false); } }); } + m_tourThread = null; } }