2013-11-09 5 views
0

Теперь он просто показывает рамку с кнопкой «решить», текстовым полем и JLabel. Когда я нажимаю «решать» с номером в текстовом поле, он должен пройти через модель NQueens, выяснить, сколько решений существует, и показать одно решение на экране с использованием макета сетки. Но когда я нажимаю кнопку «решить», ничего не происходит. Я попытался вызвать методы repaint() и revalidate() для представления, но они, похоже, не работают.GridLayout не отображается на кадре, когда он должен быть

Кнопка Solve использует отражение, чтобы перейти к контроллеру, чтобы увидеть, что делать. Кто-нибудь знает что происходит? это MVC стиль класса

Контроллер:

package model; 

public class Controller { 
    private View myView; 
    private NQueensModel myModel; 
    private int int1, possibilities; 
    public Controller() 
    { 
     myView = new View(this); 

    } 
    public void solve() 
    { 
     int1 = myView.getEntryInt(); 
     myView.doViewGrid(); 
     myModel = new NQueensModel(int1); 
     myModel.solvePuzzle(); 
     possibilities = myModel.getPossibilities(); 
     myView.addButtons(); 
     myView.setPossibilitiesLabel(possibilities); 
     myView.revalidate(); 
     myView.repaint(); 




    } 

    public boolean[][] getMyBoard() 
    { 
     return myModel.getBoard(); 
    } 


    /*public static void main(String[] args) 
    { 
     Controller controller = new Controller(); 
    }*/ 

} 

Посмотреть класс

package model; 
import java.awt.*; 

import javax.swing.*; 

import model.ButtonListener; 
import model.Controller; 



import java.lang.reflect.Method; 

@SuppressWarnings("serial") 
public class View extends JFrame { 
    private static final int FRAME_WIDTH = 600; 
    private static final int FRAME_HEIGHT = 600; 
    private static final int FRAME_X_ORIGIN = 250; 
    private static final int FRAME_Y_ORIGIN = 250; 

    private JButton solveButton; 
    JPanel gridPanel; 
    private JTextField text; 
    private String entryNum; 
    private int entryInt; 
    private ButtonListener mySolveListener; 
    private boolean[][] myBoard; 
    private JButton buttons, emptyButtons; 
    private JLabel possibilitiesLabel; 
    public static void main(String[] args){ 

    } 
    private static Controller myController; 
    public View(Controller controller) 
    { 
     JPanel gridPanel; 
     gridPanel = new JPanel(); 
     gridPanel.setBounds(100,100,400,400); 
     gridPanel.setLayout(new GridLayout(4,4)); 
     this.add(gridPanel); 
     this.setTitle("NQueens"); 
     myController = controller; 

     this.setLayout(null); 
     this.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
//  this.associateListeners(); 
     Container contentPane; 
//  this.add(contentPane); 
     this.setTitle("NQueens"); 

//  this.addWindowListener(new AWindowListener()); 
     this.setResizable(false); 
     this.setBackground(Color.WHITE); 


     solveButton = new JButton("Solve"); 
     solveButton.setBounds(500,500,80,80); 
     this.add(solveButton); 

     text = new JTextField(); 
     text.setBounds(400,500,80,80); 
     this.add(text); 

     possibilitiesLabel = new JLabel("Possibilities: "); 
     possibilitiesLabel.setBounds(240,500,80,80); 
     this.add(possibilitiesLabel); 


     this.setVisible(true); 

    } 

    public void setPossibilitiesLabel(int x) 
    { 
     possibilitiesLabel.setText("Possiblities: " + x); 
    } 
    public void doInt(){ 
     entryNum = text.getText(); 
     entryInt = Integer.parseInt(entryNum); 
    } 
    public int getEntryInt(){ 
     return entryInt; 
    } 
    public void addButtons() 
    { 
     myBoard = myController.getMyBoard(); 
     for (int i = 0; i < this.getEntryInt(); i++) 
     { 
      for(int j = 0 ; j < this.getEntryInt(); j++) 
      { 


       if(myBoard[i][j]==true) 
       { 
        buttons = new JButton("Q"); 
        gridPanel.add(buttons); 
        this.setVisible(true); 
       } 
       else 
       { 
        emptyButtons = new JButton(" "); 
        gridPanel.add(emptyButtons); 
        this.setVisible(true); 
       } 
      } 
     } 
    } 
    public void doViewGrid(){ 
     gridPanel.setLayout(new GridLayout(this.getEntryInt(),this.getEntryInt())); 
    } 
     /** 
    * Associates each component's listener with the controller 
    * and the correct method to invoke when triggered. 
    * 
    * <pre> 
    * pre: the controller class has be instantiated 
    * post: all listeners have been associated to the controller 
    *  and the method it must invoke 
    * </pre> 
    */ 
    public void associateListeners() 
    { 
     String error; 
     Class<? extends Controller> controllerClass; 
     Method solveMethod, 
       decrementMethod; 
     Class<?>[] classArgs; 
     Integer[] args; 

     controllerClass = myController.getClass(); 

     error = null; 
     solveMethod = null; 
     decrementMethod = null; 

     classArgs = new Class[1]; 
     args = new Integer[1]; 

     // Set argument types for method invokations 
     try 
     { 
      classArgs[0] = Class.forName("java.lang.Integer"); 
     } 
     catch(ClassNotFoundException exception) 
     { 
      error = exception.toString(); 
      System.out.println(error); 
     } 

     // Associate method names with actual methods to be invoked 
     try 
     { 
      solveMethod = controllerClass.getMethod("solve",classArgs); 
      decrementMethod = controllerClass.getMethod("decrement",classArgs);   
     } 

     catch(NoSuchMethodException exception) 
     { 
      error = exception.toString(); 
      System.out.println(error); 
     } 
     catch(SecurityException exception) 
     { 
      error = exception.toString(); 
      System.out.println(error); 
     } 

     // Set up listeners with actual argument values passed in 
     // to methods 

     args[0] = new Integer(200); 
     mySolveListener 
       = new ButtonListener(myController, solveMethod, args); 
//  myDecrementListener 
//    = new ButtonListener(myController, decrementMethod, args); 
    } 

} 

Модель

package model; 

public class NQueensModel 
{ 
    private int myNumsQueen; 
    public int myPossibilities=0; 
    private boolean[][] myBoard; 
    // private static NQueensModel myModel = new NQueensModel(5); 

    public static void main (String[] args) { 

//  System.out.println(myModel.solvePuzzle()); 
//  System.out.println(myModel.myPossibilities); 
//  System.out.println(myModel.doIt(myModel.myPossibilities)); //you want this 




     // System.out.println(myPossibilities); 


    } 
    public NQueensModel(int nQueens) 
    { 
     myNumsQueen = nQueens; 
     myPossibilities=0; 
     myBoard = new boolean[myNumsQueen][myNumsQueen]; 
    } 
    public boolean solvePuzzle() 
    { 
//  return this.doIt(myModel.myPossibilities); 
     return solvePuzzle(0); 

    } 
    private boolean solvePuzzle(int ncolumn) 
    { 
     if(ncolumn>myNumsQueen-1) 
     { 
      myPossibilities++; 
//   return true;   
     } 
     int i;  
     for(i =0; i<myNumsQueen;i++) 
     {   
      if(this.isSafeMove(i, ncolumn)==true) 
      {     
       this.placeQueen(i,ncolumn); 
       if(this.solvePuzzle(ncolumn+1)==true) 
       { 
        return true;     
       } 
       this.removeQueen(i, ncolumn); 
      }  

     }  
//  else if(myPossibilities>0) 
//  { 
//   return true; 
//  } 

     return false; 

    } 

    private boolean doIt(int county) 
    { 
     if(county>0) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
// private int solveCount(int count, int col) 
// { 
//  for(int j = 0 ; j<col; j++){ 
//   if(myModel.solvePuzzle(j)==true){ 
//    count++; 
//   } 
//   else if(myModel.solvePuzzle(j)==false){ 
//    return count; 
//   } 
//   else 
//   { 
//    for(int i =0 ; i<col;i++){ 
//     count = solveCount(count, col+1); 
//    } 
//    return count; 
//   } 
//   return count; 
//  } 
//  return count; 
//  
// } 
    private boolean isSafeMove(int row, int col) 
    { 
     if(row <0 || row>=myNumsQueen || col<0 || col>=myNumsQueen) 
     { 
      return false; 
     } 
     else if(this.checkLowerDiag(row, col)==true ||this.checkUpperDiag(row, col)==true ||this.checkLeft(row,col)==true) 
     { 
      return false; 
     } 
     else 
     { 

      return true; 
     } 


    } 
    private boolean checkUpperDiag(int row, int col) 
    {  
     if(row==0) 
     { 
      return false; 
     } 
     else 
     { 
      for(int i=row, j = col; i>=0 && j>=0; i--, j--) 
      { 
       if(myBoard[i][j]==true) 
       { 
        return true; 
       } 
      } 
      return false; 
     } 
    } 
    private boolean checkLowerDiag(int row, int col) 
    { 

     if(col==0) 
     {   
      return false;    
     } 
     if(row==myNumsQueen-1){ 
      return false; 
     } 
     else 
     { 

      for(int i = row, j = col; i<myNumsQueen && j>=0; i++, j--) 
      { 
//    System.out.println("error" + i + " " + j); 
       if(j>=myNumsQueen) 
       { 
        return false; 
       } 

       else if(myBoard[i][j]==true) 
       { 
        return true; 

       } 


      } 
      return false; 
     } 
    } 
    private boolean checkLeft(int row, int col) 
    { 
     if(col==0) 
     { 
      return false; 
     } 
     else 
     { 
      for(int i = col; i>=0; i--) 
      { 

       if(i>=myNumsQueen) 
       { 
        return false; 
       } 

       else if(myBoard[row][i]==true) 
       { 
        return true; 
       } 
      } 
      return false; 
     } 

    } 
    private boolean placeQueen(int row, int col) 
    { 
     if(col>=myNumsQueen) 
     { 
      return false; 
     } 

     myBoard[row][col] = true; 
     return true; 
    } 
    private boolean removeQueen(int row, int col) 
    { 
     myBoard[row][col] = false; 
     return false; 
    } 
    public int getPossibilities(){ 
     return this.myPossibilities; 
    } 
    public boolean[][] getBoard() 
    { 
     return myBoard; 
    } 
// public String toString() 
// { 
//   
// } 
} 
+1

Для лучшей помощи рано, опубликовать [SSCCE] (http://sscce.org/). –

ответ

1

Поскольку вы распечатав NoSuchMethodException, я предполагаю, что вы можете увидеть в вашем вывода, что ваш класс контроллера не имеет метода решения (Integer).

Вы сделаете одолжение, если избавитесь от всех отражений. Вам это не нужно, и ошибки, подобные этому, являются большой причиной, по которой вы не должны ее использовать. Если вы просто написали код, который вызвал методы напрямую, компилятор расскажет вам о таких вещах, как передача неправильных параметров методу.

Вот стандартный способ написать кнопку слушателя:

solveButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent event) { 
     myController.solve(200); 
    } 
}); 
+0

Я должен использовать отражение – user2909132

+0

Исключение означает: «Этот метод не работает, и вы не можете продолжать, как если бы он работал». Если вы получаете исключение NoSuchMethodException, ваш код имеет проблему, и вы должны выйти из метода associateListeners, предпочтительно с помощью 'throw new RuntimeException (exception);'. Скрытие исключения только затрудняет решение проблемы. В вашем случае он говорит вам, что метода решения (java.lang.Integer) не существует. – VGR

Смежные вопросы