0
我正在JavaFX中使用像分页控件一样的向导来输入信息,因此我需要在更改新页面之前进行一些验证,但是我找不到拦截页面更改事件的方法在它发生之前。我试图添加一个ChangeListener到currentPageIndexProperty,但虽然这会通知页面更改,但如果需要,无法阻止它。有什么办法可以避免JavaFX分页控制中的页面更改?
有没有办法避免JavaFX分页控制中的页面更改?
我正在JavaFX中使用像分页控件一样的向导来输入信息,因此我需要在更改新页面之前进行一些验证,但是我找不到拦截页面更改事件的方法在它发生之前。我试图添加一个ChangeListener到currentPageIndexProperty,但虽然这会通知页面更改,但如果需要,无法阻止它。有什么办法可以避免JavaFX分页控制中的页面更改?
有没有办法避免JavaFX分页控制中的页面更改?
我终于找到了答案感谢@ GoXR3Plus的想法,实现我自己的PaginationSkin
:
import com.sun.javafx.scene.control.skin.PaginationSkin;
import javafx.event.EventHandler;
import javafx.scene.control.Pagination;
import javafx.scene.input.KeyEvent;
class ProtocolPaginationSkin extends PaginationSkin implements EventHandler<KeyEvent> {
public ProtocolPaginationSkin(Pagination pagination) {
super(pagination);
pagination.setOnKeyPressed(this);
}
@Override
public void selectNext() {
if (getSkinnable().getCurrentPageIndex() < getSkinnable().getPageCount() - 1) {
validateAndSave(getSkinnable().getCurrentPageIndex() + 1);
}
}
@Override
public void selectPrevious() {
if (getSkinnable().getCurrentPageIndex() > 0) {
validateAndSave(getSkinnable().getCurrentPageIndex() - 1);
}
}
@Override
public void handle(KeyEvent event) {
if (event.getCode().isDigitKey()) {
int index = Integer.parseInt(event.getText()) - 1;
if (index >= 0 && index < getSkinnable().getPageCount()) {
validateAndSave(index);
}
}
}
private void validateAndSave(int index) {
if (isPageValid() && save()){
getSkinnable().setCurrentPageIndex(index);
}
}
}
凡isPageValid()
和save()
是企业的私有布尔方法。 然后,你只需要做:
pagination.setSkin(new ProtocolPaginationSkin(pagination));
感谢所有。
我从来没有尝试过这一点,但是如果验证没有通过(在属性监听器上确定页面是否有效的值),你可以禁用分页吗?这将(应该)简单地阻止用户能够首先请求页面更改。 –
@James_D:这种方法的问题是它也禁用页面上的所有控件。还有一些验证需要一些数据库查询,最好是不可自动化的。 – Nicolau
啊,好的。那将是“我从来没有试过这个”部分......这是一个想法。 –