我的项目分为两个模块:
在模型模块中:我有一个类 SudokuField
这说明 SudokuBoard
当改变的时候。然后,如果启用了提示, SudokuBoard
投掷 SudokuException
如果不可能用插入值来解数独的话。 SudokuField
通知:
public class SudokuField {
private int value = 0;
private PropertyChangeSupport notifier;
public void setValue(int value) {
if (value < 0 || value > 9) {
throw new IndexOutOfBoundsException("Number: " + value + "Expected 0-9");
}
int oldValue = this.value;
this.value = value;
notifier.firePropertyChange("value", oldValue, value);
}
}
``` `SudokuBoard` 投掷:
public class SudokuBoard implements PropertyChangeListener{
public static final int SIZE = 9;
@Override
public void propertyChange(PropertyChangeEvent evt) throws SudokuException {
if (!autoCheck) {
return;
}
if (checkBoard()) {
return;
}
int oldValue = (int) evt.getOldValue();
int newValue = (int) evt.getNewValue();
SudokuField field = (SudokuField) evt.getSource();
int i=0, j=0;
outerloop:
for (i = 0; i < SudokuBoard.SIZE; i++) {
for (j = 0; j < SudokuBoard.SIZE; j++) {
if (this.getField(i, j) == field ) {
break outerloop;
}
}
}
throw new SudokuException(
"Wrong value inserted"
+ "(old: " + oldValue
+ ", new: " + newValue + ")",
i, j, oldValue, newValue, field);
}
}
视图模块:我使用javafx和javabean来显示和同步 `SudokuField` 以及 `TextField` . 控制器的一部分:
public class Window implements Initializable {
@FXML
private GridPane sudokuPane;
private final SudokuBoard board = new SudokuBoard(new BacktrackingSudokuSolver());
private final List<List<TextField>> fields = Arrays.asList(new List[9]);
private final List<JavaBeanIntegerProperty> integerProperties =
new ArrayList<JavaBeanIntegerProperty>();
public Window() {
for (int i = 0; i < SudokuBoard.SIZE; i++) {
fields.set(i, Arrays.asList(new TextField[9]));
for (int j = 0; j < SudokuBoard.SIZE; j++) {
TextField textField = new TextField();
fields.get(i).set(j, textField);
}
}
}
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
StringConverter converter = new IntegerStringConverter();
for (int i = 0; i < SudokuBoard.SIZE; i++) {
for (int j = 0; j < SudokuBoard.SIZE; j++) {
//I generate Sudoku board and TextFields in Constructor
TextField textField = getTextField(i, j);
SudokuField field = board.getField(i, j);
JavaBeanIntegerPropertyBuilder builder = JavaBeanIntegerPropertyBuilder.create();
JavaBeanIntegerProperty integerProperty = null;
try {
integerProperty = builder.bean(field).name("value").build();
} catch (NoSuchMethodException e) {
System.out.println("Ignoring NoSuchMethodException in " + this.getClass());
}
//i need to store JavaBeanIntegerProperty, otherwise GarbageCollector
//destroys my connections
integerProperties.add(integerProperty);
//adding textField to GridPane
sudokuPane.add(textField, i, j);
textField.textProperty().bindBidirectional(integerProperty, converter);
}
}
}
}
现在的大问题是:如何处理这些问题 `SudokuExceptions` 在控制器的某个地方?从这个异常中,我可以很容易地获得任何信息来修改所需的textfield,但是我不能处理它。我试着加上:
Thread.setDefaultUncaughtExceptionHandler(Window::exceptionHandler);
//and
Thread.currentThread().setDefaultUncaughtExceptionHandler(Window::exceptionHandler);
``` exceptionHandler
中的方法 Window
控制器:
public static void exceptionHandler(Thread thread, Throwable throwable) {
for (int i = 0; i < 100; i++) {
System.out.println("working: " + i);
}
}
在 initialize
控制器的构造方法,以及 Main
视图模块的类 main
以及 start
方法,但它没有调用这个方法(我用 System.out.println
). 我不想补充 PropertyChangeListener
至 SudokuBoard
,因为我希望对模型模块进行尽可能小的更改。
整个项目是作为我大学课程的一部分开发的项目。
1条答案
按热度按时间balp4ylt1#
好吧,我找到了这个错误报告,我想因为这个,我不能做我想要的。所以我创造了我自己的
ActionEvent
是“抛出”而不是SudokuException
在SudokuBoard
并补充道ActionEventListener
我的控制器接口。也许这不是我真正想要的解决方案,但我觉得它更漂亮。特别感谢我的朋友帮助我。我将保留这个问题,因为可能有人知道如何绕过这个异常处理问题,其他人可以使用这个答案。