10

閉じることができるタブを持つ TabPane があります。ユーザーがタブのコンテンツのボタンをクリックしたときに「タブを閉じるイベント」を発生させたい。ユーザーがボタンをクリックしたときに呼び出されるメソッドは次のとおりです。

public class CustomTab extends Tab {

    ...

    protected void close() {
        Event.fireEvent(this, new Event(Tab.CLOSED_EVENT));
    }

    ....
}

このカスタム タブを次のようにタブペインに追加します。

TabPane tabPane = new TabPane();
...
CustomTab tab = new CustomTab();
tab.setOnClosed(new EventHandler<Event>() {
    @Override
    public void handle(Event t) {
        System.out.println("Closed!");
    }
});
tabPane.getTabs().add(tab);
tabPane.getSelectionModel().select(tab);

通常、タブのヘッダーにある (既定の) 閉じるアイコンをクリックしてタブを閉じることができます。画面に出力されます。ただし、ユーザーがボタン (タブのコンテンツ内) をクリックして のclose()メソッドを呼び出すとCustomTab、再び「Closed!」になります。が画面に出力されますが、今回はタブが閉じられません。変じゃない?

任意のボタンをクリックしてタブを閉じるにはどうすればよいですか?

PS: tabPane.getTabs().remove(tab) は機能しますが、対応するイベントの発生は非常にエレガントです。また、タブを閉じる必要があります。

4

2 に答える 2

13

のみを使用するアプローチtabPane.getTabs().remove(tab)は、設定されている場合に「onClosed」ハンドラーを呼び出さないため、完全には正しくありません。私は次の方法を使用しています:

private void closeTab(Tab tab) {
        EventHandler<Event> handler = tab.getOnClosed();
        if (null != handler) {
            handler.handle(null);
        } else {
            tab.getTabPane().getTabs().remove(tab);
        }
    }

ハンドラーが設定されていない場合はタブを削除するか、「onClosed」ハンドラーを呼び出します。

于 2014-01-09T14:29:31.960 に答える
12

これについて機能リクエストを開きました。

それまでの間、Java 8 を使用していて、カスタム TabPane スキンを使用していない場合は、この回避策を使用して、閉じるボタンがクリックされたときに行われる正確な終了動作を模倣できます。

import javafx.scene.control.Tab;

import com.sun.javafx.scene.control.behavior.TabPaneBehavior;
import com.sun.javafx.scene.control.skin.TabPaneSkin;

public class MyTab extends Tab {

    public void requestClose() {
        TabPaneBehavior behavior = getBehavior();
        if(behavior.canCloseTab(this)) {
            behavior.closeTab(this);
        }
    }

    private TabPaneBehavior getBehavior() {
        return ((TabPaneSkin) getTabPane().getSkin()).getBehavior();
    }
}
于 2014-04-01T11:04:03.250 に答える