Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package framework;
- import bridge.BridgeCanvas;
- import graph.DequeAdder;
- import graph.Vertex;
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.Dimension;
- import java.awt.FlowLayout;
- import java.awt.Font;
- import java.awt.GridLayout;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.util.Deque;
- import java.util.Iterator;
- import java.util.LinkedList;
- import java.util.List;
- import javax.swing.BorderFactory;
- import javax.swing.ButtonGroup;
- import javax.swing.JButton;
- import javax.swing.JComponent;
- import javax.swing.JLabel;
- import javax.swing.JOptionPane;
- import javax.swing.JPanel;
- import javax.swing.JRadioButton;
- import javax.swing.JTextArea;
- import javax.swing.Timer;
- import javax.swing.border.EmptyBorder;
- import javax.swing.border.MatteBorder;
- import javax.swing.border.TitledBorder;
- /**
- * A class that creates GUI components for solving search problems.
- *
- * @author Jake Bible
- */
- public class GUI extends JComponent {
- public GUI(final Problem problem, Canvas newCanvas) {
- // You must write
- setLayout(new BorderLayout());
- originalState = problem.getCurrentState();
- moveCount = 0;
- canvas = newCanvas;
- canvas.setPreferredSize(new Dimension(400, 400));
- //Makes intro
- makeIntroductionBox(problem);
- //Makes canvas display and buttons (including reset button)
- makeCenter(problem);
- theproblem = problem;
- setOpaque(false);
- }
- // private methods and instance fields go here
- private void makeCenter(final Problem problem) {
- //Making center
- final JPanel centerFlow = new JPanel(new FlowLayout(FlowLayout.CENTER));
- centerFlow.setBorder(new EmptyBorder(0, 25, 25, 15));
- List<Move> list1 = problem.getMoves();
- int numberMoves = 0;
- for (Iterator<Move> it = list1.iterator(); it.hasNext(); numberMoves++) {
- Move newmove = it.next();
- }
- //Panel to store buttons
- JPanel gridButtons = new JPanel(new GridLayout(numberMoves, 1, 20, 1));
- //Setting up canvas + buttons
- State curr = problem.getCurrentState();
- canvas.setState(curr);
- //giving titles
- TitledBorder title1 = new TitledBorder("Current State");
- TitledBorder title2 = new TitledBorder("Possible Moves");
- gridButtons.setBorder(title2);
- canvas.setBorder(title1);
- centerFlow.add(canvas);
- //Constructing movelist
- for (final Move newmove : list1) {
- final JButton button1 = new JButton(newmove.getMoveName());
- button1.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- State newState = newmove.doMove(problem.getCurrentState());
- if (newState == null) {
- JOptionPane.showMessageDialog(button1, "Illegal Move");
- } else {
- problem.setCurrentState(newState);
- State curr = problem.getCurrentState();
- canvas.setState(curr);
- canvas.render();
- // centerFlow.repaint();
- // centerFlow.revalidate();
- moveCount++;
- if (problem.success()) {
- JOptionPane.showMessageDialog(button1, "Congratulations. You solved the problem in " + moveCount + " moves.");
- }
- }
- }
- });
- gridButtons.add(button1);
- }
- final JLabel slength = new JLabel("Solution Length: " + sLength1);
- final JLabel dequeOPS = new JLabel("Num of DEQUE Ops: ");
- final JLabel dequeMAX = new JLabel("Max DEQUE Size: ");
- //BUILDING TIMER
- final int DELAY = 1000;
- // Milliseconds between timer ticks`1
- final Timer t = new Timer(DELAY, new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- if (!problem.success()) {
- if (!solutionlist.isEmpty()) {
- State nextState = (State) solutionlist.removeLast();
- problem.setCurrentState(nextState);
- canvas.setState(nextState);
- canvas.render();
- moveCount++;
- }
- }
- }
- });
- //Building the reset Button
- JButton resetButton = new JButton("RESET");
- resetButton.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- problem.setCurrentState(originalState);
- State curr = problem.getCurrentState();
- canvas.setState(originalState);
- canvas.render();
- centerFlow.repaint();
- centerFlow.revalidate();
- moveCount = 0;
- sLength1 = 0;
- sDEOPS1 = 0;
- sdeLENGTH1 = 0;
- slength.setText("Solution Length: " + sLength1);
- dequeOPS.setText("Num of DEQUE OPS: " + sDEOPS1);
- dequeMAX.setText("Max DEQUE Size: " + sdeLENGTH1);
- t.stop();
- }
- });
- //Declaring and initializing label grid
- final JPanel labelgrid = new JPanel(new GridLayout(3, 1, 3, 1));
- //Building the solve button
- final JButton solveButton = new JButton("SOLVE");
- solveButton.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- if (breadthsearch) {
- Vertex vsolution = theproblem.search((Vertex) theproblem.getCurrentState(), tailAdder);
- if (vsolution == null) {
- JOptionPane.showMessageDialog(solveButton, "No Solution found.");
- } else {
- sDEOPS1 = vsolution.getDEQUEops();
- sdeLENGTH1 = vsolution.getDEQUElength();
- sLength1 = -1;
- LinkedList<Vertex> newsolutionlist = new LinkedList<Vertex>();
- while (vsolution != null) {
- newsolutionlist.add(vsolution);
- vsolution = vsolution.getPredecessor();
- sLength1++;
- System.out.println("" + sLength1);
- }
- Vertex garbage = newsolutionlist.removeLast();
- solutionlist = newsolutionlist;
- slength.setText("Solution Length: " + sLength1);
- dequeOPS.setText("Num of DEQUE OPS: " + sDEOPS1);
- dequeMAX.setText("Max DEQUE Size: " + sdeLENGTH1);
- slength.repaint();
- dequeOPS.repaint();
- dequeMAX.repaint();
- problem.setCurrentState(originalState);
- }
- } else {
- Vertex vsolution = theproblem.search((Vertex) theproblem.getCurrentState(), headAdder);
- if (vsolution == null) {
- JOptionPane.showMessageDialog(solveButton, "No Solution found.");
- } else {
- sDEOPS1 = vsolution.getDEQUEops();
- sdeLENGTH1 = vsolution.getDEQUElength();
- sLength1 = -1;
- LinkedList<Vertex> newsolutionlist = new LinkedList<Vertex>();
- while (vsolution != null) {
- newsolutionlist.add(vsolution);
- vsolution = vsolution.getPredecessor();
- sLength1++;
- }
- Vertex garbage = newsolutionlist.removeLast();
- solutionlist = newsolutionlist;
- slength.setText("Solution Length: " + sLength1);
- dequeOPS.setText("Num of DEQUE OPS: " + sDEOPS1);
- dequeMAX.setText("Max DEQUE Size: " + sdeLENGTH1);
- slength.repaint();
- dequeOPS.repaint();
- dequeMAX.repaint();
- System.out.println("" + sLength1);
- problem.setCurrentState(originalState);
- }
- }
- }
- });
- solveButton.setPreferredSize(new Dimension(50, 50));
- //radiobuttons
- ButtonGroup buttonGroup = new ButtonGroup();
- JRadioButton radio1 = new JRadioButton("Depth-First");
- JRadioButton radio2 = new JRadioButton("Breadth-first");
- buttonGroup.add(radio1);
- buttonGroup.add(radio2);
- radio2.setSelected(true);
- breadthsearch = true;
- JPanel radiogrid = new JPanel(new GridLayout(2, 1, 2, 1));
- JPanel leftbottomgrid = new JPanel(new GridLayout(2, 1, 2, 1));
- radiogrid.add(radio1);
- radiogrid.add(radio2);
- radiogrid.setBorder(new TitledBorder("Search Types"));
- radio1.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- breadthsearch = false;
- }
- });
- radio2.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- breadthsearch = true;
- }
- });
- leftbottomgrid.add(radiogrid);
- leftbottomgrid.add(solveButton);
- //right stuff.
- JPanel rightbottomgrid = new JPanel(new GridLayout(3, 1, 3, 1));
- //nextmove button
- //Building the nextmove Button
- final JButton nextmoveButton = new JButton("SHOW NEXT MOVE");
- nextmoveButton.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- if (!solutionlist.isEmpty()) {
- State nextState = (State) solutionlist.removeLast();
- problem.setCurrentState(nextState);
- canvas.setState(nextState);
- canvas.render();
- moveCount++;
- }
- if (problem.success()) {
- JOptionPane.showMessageDialog(nextmoveButton, "Congratulations. You solved the problem in " + moveCount + " moves.");
- }
- }
- });
- nextmoveButton.setPreferredSize(new Dimension(20, 40));
- //allmove button
- //Building the allmove Button
- JButton allmoveButton = new JButton("SHOW ALL MOVES");
- allmoveButton.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- t.start();
- }
- });
- allmoveButton.setPreferredSize(new Dimension(20, 40));
- //
- labelgrid.add(slength);
- labelgrid.add(dequeOPS);
- labelgrid.add(dequeMAX);
- labelgrid.setBorder(new TitledBorder("Solution Statistics"));
- //Centering the bottom
- rightbottomgrid.add(labelgrid);
- rightbottomgrid.add(nextmoveButton);
- rightbottomgrid.add(allmoveButton);
- rightbottomgrid.setPreferredSize(new Dimension(200, 200));
- JPanel bottomCenterFlow = wrapCenterFlowLayout(leftbottomgrid);
- bottomCenterFlow.add(resetButton);
- bottomCenterFlow.add(rightbottomgrid);
- bottomCenterFlow.setOpaque(false);
- //Adding the components
- centerFlow.add(gridButtons);
- add(centerFlow, BorderLayout.CENTER);
- add(bottomCenterFlow, BorderLayout.SOUTH);
- }
- private JPanel wrapCenterFlowLayout(JComponent component1) {
- JPanel newFlowLayout = new JPanel(new FlowLayout(FlowLayout.CENTER));
- newFlowLayout.add(component1);
- return newFlowLayout;
- }
- //Makes intro
- private void makeIntroductionBox(Problem problem) {
- JTextArea box1 = new JTextArea(problem.getIntroduction());
- box1.setFont(new Font("San Serif", Font.BOLD, 14));
- JPanel boxPanel = wrapCenterFlowLayout(box1);
- boxPanel.setOpaque(false);
- boxPanel.setBorder(new EmptyBorder(0, 0, 40, 0));
- add(boxPanel, BorderLayout.NORTH);
- }
- private State originalState;
- private int moveCount;
- private Canvas canvas;
- private boolean breadthsearch;
- private Problem theproblem;
- private int sLength1;
- private int sDEOPS1;
- private int sdeLENGTH1;
- private LinkedList<Vertex> solutionlist;
- /**
- * This DequeAdder is used to perform breadth-first search in testSearch1
- * and testSearch2
- */
- private DequeAdder tailAdder = new DequeAdder() {
- @Override
- public void add(Vertex vertex, Deque<Vertex> deque) {
- deque.addLast(vertex);
- }
- };
- /**
- * This DequeAdder is used to perform breadth-first search in testSearch1
- * and testSearch2
- */
- private DequeAdder headAdder = new DequeAdder() {
- @Override
- public void add(Vertex vertex, Deque<Vertex> deque) {
- deque.addFirst(vertex);
- }
- };
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement