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
啊,好的。那將是「我從來沒有試過這個」部分......這是一個想法。 –