Advertisement
Guest User

Untitled

a guest
Nov 24th, 2014
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.53 KB | None | 0 0
  1. package framework;
  2.  
  3. import bridge.BridgeCanvas;
  4. import graph.DequeAdder;
  5. import graph.Vertex;
  6. import java.awt.BorderLayout;
  7. import java.awt.Color;
  8. import java.awt.Dimension;
  9. import java.awt.FlowLayout;
  10. import java.awt.Font;
  11. import java.awt.GridLayout;
  12. import java.awt.event.ActionEvent;
  13. import java.awt.event.ActionListener;
  14. import java.util.Deque;
  15. import java.util.Iterator;
  16. import java.util.LinkedList;
  17. import java.util.List;
  18. import javax.swing.BorderFactory;
  19. import javax.swing.ButtonGroup;
  20. import javax.swing.JButton;
  21. import javax.swing.JComponent;
  22. import javax.swing.JLabel;
  23. import javax.swing.JOptionPane;
  24. import javax.swing.JPanel;
  25. import javax.swing.JRadioButton;
  26. import javax.swing.JTextArea;
  27. import javax.swing.Timer;
  28. import javax.swing.border.EmptyBorder;
  29. import javax.swing.border.MatteBorder;
  30. import javax.swing.border.TitledBorder;
  31.  
  32. /**
  33. * A class that creates GUI components for solving search problems.
  34. *
  35. * @author Jake Bible
  36. */
  37. public class GUI extends JComponent {
  38.  
  39. public GUI(final Problem problem, Canvas newCanvas) {
  40. // You must write
  41. setLayout(new BorderLayout());
  42. originalState = problem.getCurrentState();
  43. moveCount = 0;
  44. canvas = newCanvas;
  45. canvas.setPreferredSize(new Dimension(400, 400));
  46. //Makes intro
  47. makeIntroductionBox(problem);
  48.  
  49. //Makes canvas display and buttons (including reset button)
  50. makeCenter(problem);
  51. theproblem = problem;
  52.  
  53. setOpaque(false);
  54. }
  55.  
  56. // private methods and instance fields go here
  57. private void makeCenter(final Problem problem) {
  58. //Making center
  59. final JPanel centerFlow = new JPanel(new FlowLayout(FlowLayout.CENTER));
  60. centerFlow.setBorder(new EmptyBorder(0, 25, 25, 15));
  61. List<Move> list1 = problem.getMoves();
  62. int numberMoves = 0;
  63. for (Iterator<Move> it = list1.iterator(); it.hasNext(); numberMoves++) {
  64. Move newmove = it.next();
  65. }
  66.  
  67. //Panel to store buttons
  68. JPanel gridButtons = new JPanel(new GridLayout(numberMoves, 1, 20, 1));
  69.  
  70. //Setting up canvas + buttons
  71. State curr = problem.getCurrentState();
  72. canvas.setState(curr);
  73. //giving titles
  74. TitledBorder title1 = new TitledBorder("Current State");
  75. TitledBorder title2 = new TitledBorder("Possible Moves");
  76. gridButtons.setBorder(title2);
  77. canvas.setBorder(title1);
  78.  
  79. centerFlow.add(canvas);
  80.  
  81. //Constructing movelist
  82. for (final Move newmove : list1) {
  83. final JButton button1 = new JButton(newmove.getMoveName());
  84. button1.addActionListener(new ActionListener() {
  85. @Override
  86. public void actionPerformed(ActionEvent e) {
  87. State newState = newmove.doMove(problem.getCurrentState());
  88. if (newState == null) {
  89. JOptionPane.showMessageDialog(button1, "Illegal Move");
  90. } else {
  91. problem.setCurrentState(newState);
  92. State curr = problem.getCurrentState();
  93. canvas.setState(curr);
  94. canvas.render();
  95. // centerFlow.repaint();
  96. // centerFlow.revalidate();
  97. moveCount++;
  98. if (problem.success()) {
  99. JOptionPane.showMessageDialog(button1, "Congratulations. You solved the problem in " + moveCount + " moves.");
  100. }
  101. }
  102. }
  103. });
  104. gridButtons.add(button1);
  105. }
  106. final JLabel slength = new JLabel("Solution Length: " + sLength1);
  107. final JLabel dequeOPS = new JLabel("Num of DEQUE Ops: ");
  108. final JLabel dequeMAX = new JLabel("Max DEQUE Size: ");
  109. //BUILDING TIMER
  110. final int DELAY = 1000;
  111. // Milliseconds between timer ticks`1
  112.  
  113. final Timer t = new Timer(DELAY, new ActionListener() {
  114. @Override
  115. public void actionPerformed(ActionEvent e) {
  116. if (!problem.success()) {
  117. if (!solutionlist.isEmpty()) {
  118. State nextState = (State) solutionlist.removeLast();
  119. problem.setCurrentState(nextState);
  120. canvas.setState(nextState);
  121. canvas.render();
  122. moveCount++;
  123. }
  124. }
  125. }
  126. });
  127. //Building the reset Button
  128. JButton resetButton = new JButton("RESET");
  129. resetButton.addActionListener(new ActionListener() {
  130. @Override
  131. public void actionPerformed(ActionEvent e) {
  132. problem.setCurrentState(originalState);
  133. State curr = problem.getCurrentState();
  134. canvas.setState(originalState);
  135. canvas.render();
  136. centerFlow.repaint();
  137. centerFlow.revalidate();
  138. moveCount = 0;
  139. sLength1 = 0;
  140. sDEOPS1 = 0;
  141. sdeLENGTH1 = 0;
  142. slength.setText("Solution Length: " + sLength1);
  143. dequeOPS.setText("Num of DEQUE OPS: " + sDEOPS1);
  144. dequeMAX.setText("Max DEQUE Size: " + sdeLENGTH1);
  145. t.stop();
  146. }
  147. });
  148.  
  149. //Declaring and initializing label grid
  150. final JPanel labelgrid = new JPanel(new GridLayout(3, 1, 3, 1));
  151.  
  152.  
  153. //Building the solve button
  154. final JButton solveButton = new JButton("SOLVE");
  155. solveButton.addActionListener(new ActionListener() {
  156. @Override
  157. public void actionPerformed(ActionEvent e) {
  158. if (breadthsearch) {
  159. Vertex vsolution = theproblem.search((Vertex) theproblem.getCurrentState(), tailAdder);
  160. if (vsolution == null) {
  161. JOptionPane.showMessageDialog(solveButton, "No Solution found.");
  162. } else {
  163. sDEOPS1 = vsolution.getDEQUEops();
  164. sdeLENGTH1 = vsolution.getDEQUElength();
  165. sLength1 = -1;
  166. LinkedList<Vertex> newsolutionlist = new LinkedList<Vertex>();
  167.  
  168. while (vsolution != null) {
  169. newsolutionlist.add(vsolution);
  170. vsolution = vsolution.getPredecessor();
  171. sLength1++;
  172. System.out.println("" + sLength1);
  173. }
  174. Vertex garbage = newsolutionlist.removeLast();
  175. solutionlist = newsolutionlist;
  176. slength.setText("Solution Length: " + sLength1);
  177. dequeOPS.setText("Num of DEQUE OPS: " + sDEOPS1);
  178. dequeMAX.setText("Max DEQUE Size: " + sdeLENGTH1);
  179. slength.repaint();
  180. dequeOPS.repaint();
  181. dequeMAX.repaint();
  182. problem.setCurrentState(originalState);
  183. }
  184. } else {
  185. Vertex vsolution = theproblem.search((Vertex) theproblem.getCurrentState(), headAdder);
  186. if (vsolution == null) {
  187. JOptionPane.showMessageDialog(solveButton, "No Solution found.");
  188. } else {
  189. sDEOPS1 = vsolution.getDEQUEops();
  190. sdeLENGTH1 = vsolution.getDEQUElength();
  191. sLength1 = -1;
  192. LinkedList<Vertex> newsolutionlist = new LinkedList<Vertex>();
  193.  
  194. while (vsolution != null) {
  195. newsolutionlist.add(vsolution);
  196. vsolution = vsolution.getPredecessor();
  197. sLength1++;
  198. }
  199. Vertex garbage = newsolutionlist.removeLast();
  200. solutionlist = newsolutionlist;
  201. slength.setText("Solution Length: " + sLength1);
  202. dequeOPS.setText("Num of DEQUE OPS: " + sDEOPS1);
  203. dequeMAX.setText("Max DEQUE Size: " + sdeLENGTH1);
  204. slength.repaint();
  205. dequeOPS.repaint();
  206. dequeMAX.repaint();
  207. System.out.println("" + sLength1);
  208. problem.setCurrentState(originalState);
  209. }
  210. }
  211. }
  212. });
  213. solveButton.setPreferredSize(new Dimension(50, 50));
  214. //radiobuttons
  215. ButtonGroup buttonGroup = new ButtonGroup();
  216. JRadioButton radio1 = new JRadioButton("Depth-First");
  217. JRadioButton radio2 = new JRadioButton("Breadth-first");
  218. buttonGroup.add(radio1);
  219. buttonGroup.add(radio2);
  220. radio2.setSelected(true);
  221. breadthsearch = true;
  222. JPanel radiogrid = new JPanel(new GridLayout(2, 1, 2, 1));
  223. JPanel leftbottomgrid = new JPanel(new GridLayout(2, 1, 2, 1));
  224. radiogrid.add(radio1);
  225. radiogrid.add(radio2);
  226. radiogrid.setBorder(new TitledBorder("Search Types"));
  227.  
  228. radio1.addActionListener(new ActionListener() {
  229. @Override
  230. public void actionPerformed(ActionEvent e) {
  231. breadthsearch = false;
  232. }
  233. });
  234. radio2.addActionListener(new ActionListener() {
  235. @Override
  236. public void actionPerformed(ActionEvent e) {
  237. breadthsearch = true;
  238. }
  239. });
  240.  
  241. leftbottomgrid.add(radiogrid);
  242. leftbottomgrid.add(solveButton);
  243. //right stuff.
  244. JPanel rightbottomgrid = new JPanel(new GridLayout(3, 1, 3, 1));
  245. //nextmove button
  246. //Building the nextmove Button
  247. final JButton nextmoveButton = new JButton("SHOW NEXT MOVE");
  248. nextmoveButton.addActionListener(new ActionListener() {
  249. @Override
  250. public void actionPerformed(ActionEvent e) {
  251. if (!solutionlist.isEmpty()) {
  252. State nextState = (State) solutionlist.removeLast();
  253. problem.setCurrentState(nextState);
  254. canvas.setState(nextState);
  255. canvas.render();
  256. moveCount++;
  257. }
  258. if (problem.success()) {
  259. JOptionPane.showMessageDialog(nextmoveButton, "Congratulations. You solved the problem in " + moveCount + " moves.");
  260. }
  261.  
  262. }
  263. });
  264. nextmoveButton.setPreferredSize(new Dimension(20, 40));
  265.  
  266.  
  267.  
  268. //allmove button
  269. //Building the allmove Button
  270.  
  271.  
  272. JButton allmoveButton = new JButton("SHOW ALL MOVES");
  273.  
  274.  
  275. allmoveButton.addActionListener(new ActionListener() {
  276. @Override
  277. public void actionPerformed(ActionEvent e) {
  278. t.start();
  279. }
  280. });
  281.  
  282. allmoveButton.setPreferredSize(new Dimension(20, 40));
  283.  
  284. //
  285.  
  286.  
  287. labelgrid.add(slength);
  288. labelgrid.add(dequeOPS);
  289. labelgrid.add(dequeMAX);
  290. labelgrid.setBorder(new TitledBorder("Solution Statistics"));
  291. //Centering the bottom
  292. rightbottomgrid.add(labelgrid);
  293. rightbottomgrid.add(nextmoveButton);
  294. rightbottomgrid.add(allmoveButton);
  295. rightbottomgrid.setPreferredSize(new Dimension(200, 200));
  296. JPanel bottomCenterFlow = wrapCenterFlowLayout(leftbottomgrid);
  297.  
  298. bottomCenterFlow.add(resetButton);
  299. bottomCenterFlow.add(rightbottomgrid);
  300. bottomCenterFlow.setOpaque(false);
  301.  
  302.  
  303. //Adding the components
  304. centerFlow.add(gridButtons);
  305. add(centerFlow, BorderLayout.CENTER);
  306. add(bottomCenterFlow, BorderLayout.SOUTH);
  307. }
  308.  
  309. private JPanel wrapCenterFlowLayout(JComponent component1) {
  310. JPanel newFlowLayout = new JPanel(new FlowLayout(FlowLayout.CENTER));
  311. newFlowLayout.add(component1);
  312. return newFlowLayout;
  313. }
  314.  
  315. //Makes intro
  316. private void makeIntroductionBox(Problem problem) {
  317. JTextArea box1 = new JTextArea(problem.getIntroduction());
  318. box1.setFont(new Font("San Serif", Font.BOLD, 14));
  319. JPanel boxPanel = wrapCenterFlowLayout(box1);
  320. boxPanel.setOpaque(false);
  321.  
  322. boxPanel.setBorder(new EmptyBorder(0, 0, 40, 0));
  323. add(boxPanel, BorderLayout.NORTH);
  324. }
  325. private State originalState;
  326. private int moveCount;
  327. private Canvas canvas;
  328. private boolean breadthsearch;
  329. private Problem theproblem;
  330. private int sLength1;
  331. private int sDEOPS1;
  332. private int sdeLENGTH1;
  333. private LinkedList<Vertex> solutionlist;
  334. /**
  335. * This DequeAdder is used to perform breadth-first search in testSearch1
  336. * and testSearch2
  337. */
  338. private DequeAdder tailAdder = new DequeAdder() {
  339. @Override
  340. public void add(Vertex vertex, Deque<Vertex> deque) {
  341. deque.addLast(vertex);
  342. }
  343. };
  344. /**
  345. * This DequeAdder is used to perform breadth-first search in testSearch1
  346. * and testSearch2
  347. */
  348. private DequeAdder headAdder = new DequeAdder() {
  349. @Override
  350. public void add(Vertex vertex, Deque<Vertex> deque) {
  351. deque.addFirst(vertex);
  352. }
  353. };
  354. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement