2015-12-13 3 views
-1

Я только что закончил писать решение sudoku. Он имеет два класса: консольный решатель и решатель gui. У консольного решателя есть метод под названием solve, который рекурсивно решает судоку. Gui расширяет консольный решатель, а также использует его метод решения. Легко следить за каждым шаге рекурсии, распечатав поле судоку внутри метода, прежде чем делать другой рекурсивный вызов, например:Как получить рекурсивные вызовы от метода

System.out.println(field); 

// solve next cell 
if (j < 8) solve(field, row, column + 1); 
else solve(field, row + 1, 0; 
} 

Но как я могу идти об отображении изменений в поле в gui? Я использую JTable для отображения поля sudoku в gui. В настоящее время я просто показываю результат, но не шаги, ведущие к нему, что кажется скучным.

Вот некоторые более соответствующий код:

/* solve button action listener/handler */ 


    solveButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 

      /* solve the sudoku and display it 
       * in solve table. 
       */ 
       fieldToTable(field, solveTable); //put sudoku field in display 
       try { 
        solve(field, 0, 0); // Solve starting at [0,0] 
       } catch (SolvedException d) { 
        /* SOLVED */ 

        } 

         } //End of action handler 
      }); // End of action listener 


    /* Done with solve button action listener */ 
+0

Не могли бы вы опубликовать более соответствующий код? –

+0

Моя первая мысль заключается в том, чтобы GUI реализовал некоторый интерфейс, который может обновить необходимую информацию, тогда ваши рекурсивные вызовы могут проходить по этому экземпляру интерфейса и вызвать метод интерфейса с соответствующей информацией (по крайней мере, с указанием местоположения ячейки и значения) –

+0

Yassin: Just отредактированный пост с кодом, используемым в классе sudokuGUI Крикет: Мне жаль, но я ничего не понимаю. Я новичок. – yeahboy

ответ

0

Вы могли бы «решить» это в тему и информировать Совет на каждой итерации. Вот базовый apporach с использованием Thread - более сложный, вероятно, будет использовать SwingWorker.

Отказ от ответственности: Возможно, вам придется добавить дополнительные проверки, сделать некоторые переменные окончательными и так далее, чтобы сделать эту работу.

solveButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     /* solve the sudoku and display it in solve table. */ 
     fieldToTable(field, solveTable); //put sudoku field in display 
     //Disable button while solving 
     solveButton.setEnabled(false); 
     //Start Thread to do the work 
     new Thread() { 
      public void run() { 
       try { 
       solve(field, 0, 0); 
       } catch(SolvedException se) { 
       //What now - reenable button     
       SwingUtilities.invokeLater(() -> solveButton.setEnabled(true)); 
       } 
      } 
     }.start();      
     } //End of action handler 
    }); // End of action listener 

и изменение решения() для обновления платы при каждом вызове:

public void solve(Field field, int x, int y) { 
    SwingUtilities.invokeLater(() -> fieldToTable(field, solveTable)); 

    // YOUR SOLVE LOGIC 
} 
Смежные вопросы