1

各タブに閉じるボタンを備えたタブ付きインターフェイスを Java で構築したいと考えています。そのために、次のクラスを使用しました: ButtonTabComponent

GUI に新しいタブを作成するボタンがあります。新しいタブ ボタンを 4 回押すと、4 つのタブが作成されます。

| | タブ 0 | タブ 1 | タブ 2 | タブ 3 | (各タブには閉じるボタンがあります)

ここで、タブ 1 を閉じることにしましたが、問題が発生します。中央のタブを閉じると、すべてのインデックスが並べ替えられます。つまり、次のことを意味します。

| | タブ 0 | タブ 2 | タブ 3 | (タブ 2 のインデックスは 1 になります)

ここで新しいタブを作成しようとすると、タブは作成されますが、新しいタブ:

| | タブ 0 | タブ 2 | タブ 3 | タブ 1| (タブ 1 には閉じるボタンがありません)

新しいタブをもう一度クリックすると、次のようになります。

| | タブ 0 | タブ 2 | タブ 3 | タブ 1 | タブ 4 | (タブ 4 で問題ありません。閉じるボタンがあります)

ここで、タブ 2 を閉じることにしました。次のようになります。

| | タブ 0 | タブ 3 | タブ 1| タブ 4| (タブ 3 のインデックスは 1 になります)

新しいタブを作成する場合:

| | タブ 0 | タブ 3 | タブ 1| タブ 4| タブ 1 | (最後のタブには閉じるボタンがありません)。

これはインデックスが原因であると考えており、同様の質問をスタックオーバーフローで読みました: stackoverflow.com/questions/15312252/jtabbedpane-arrayindexoutofboundsexception可能な解決策は

タブ付きペインのインデックスではなく、タブ項目への参照をリスナーに渡します。

その方法がわかりません。誰かに何かヒントがあれば、本当に感謝します。各タブはファイルを開き、ファイルに保存する機能があり、明らかにタブインデックスは信頼できないため、各タブの確実な参照を保持する必要があります。

編集:コードに新しいタブを追加する方法は次のとおりです。

...//main class
private final JTabbedPane pane = new JTabbedPane();
//I am using an array to store the tabs created
//I initialize the array with false. the idea was that when a new tab get created, one item in the array
//gets the true value. when the tab is closed, the array item (based on the index) is set back to false
arrTabList = new boolean[10];
        for(int i=0; i<10; i++){
            arrTabList[i] = false;
        }

...


public void newFile()  //this function opens a new tab
{
//parse the array to check the first item with false status
    for(int i=0; i<10; i++){
        if(!arrTabList[i]) {
            System.out.println("false");
            PanelCounter = i;
            break;
            }
    }
    newTab t = new newTab();   //object which contains the tab content (a bunch of graphical components, input fields mostly)
    pane.add("New Entry" + PanelCounter, t.createContentPane());   //adds the new tab to the main window
    pane.setTabComponentAt(PanelCounter, new ButtonTabComponent(pane, this));
    arrTabList[PanelCounter] = true;  //sets the item array to true
}

//when a tab is closed, this function is called in the listener:
public void decreaseCounter(int i)
{
        arrTabList[i] = false;  //sets the item array back to false
}
4

3 に答える 3

1

エラーは呼び出しにあります

pane.setTabComponentAt(PanelCounter, new ButtonTabComponent(pane, this));

ボタンをタブ インデックスに追加するのではなく、作成したタブ インデックスに追加しますPanelCounter。そのインデックスは を使用して取得できますがgetTabCount()、もちろんこの時点では高すぎるため、次のようになります。

pane.setTabComponentAt(pane.getTabCount()-1, new ButtonTabComponent(pane, this));
于 2013-05-29T21:37:03.353 に答える