2017-07-03 8 views
1

私のフォームにTabsコンポーネントがあります。タブはナビゲーションに使用されます。 私はすべてのタブを閉じて、私はこの方法を使用するすべてのタブを閉じるにはインデックス0で新しいものを開くために必要がある場合があります:コードネームワン - すべてのタブを閉じる方法(コード経由)

void close(int from) { 
    int to = tabs.getTabCount() - 1; 
    for (int i = to; i >= from; i--) { 
     tabs.removeTabAt(i); 
    } 
    if (from > 0) 
     tabs.setSelectedIndex(from - 1); 
} 

void closeAll() { 
    close(0); 
} 

これは動作しますが、常にではありません。時々私は2つの例外を受け取る:

[EDT] 0:0:8,436 - Exception: java.lang.IndexOutOfBoundsException - Index: 1, Size: 0 
java.lang.IndexOutOfBoundsException: Index: 1, Size: 0 
    at java.util.ArrayList.rangeCheck(ArrayList.java:653) 
    at java.util.ArrayList.get(ArrayList.java:429) 
    at com.codename1.ui.Container.getComponentAt(Container.java:1551) 
    at com.codename1.ui.Container.doLayout(Container.java:1520) 
    at com.codename1.ui.Container.layoutContainer(Container.java:1509) 
    at com.codename1.ui.Container.doLayout(Container.java:1522) 
    at com.codename1.ui.Container.layoutContainer(Container.java:1509) 
    at com.codename1.ui.Container.paint(Container.java:1406) 
    at com.codename1.ui.Component.internalPaintImpl(Component.java:1333) 
    at com.codename1.ui.Component.paintInternalImpl(Component.java:1307) 
    at com.codename1.ui.Component.paintInternal(Component.java:1282) 
    at com.codename1.ui.Component.paintInternal(Component.java:1250) 
    at com.codename1.ui.Component.paintComponent(Component.java:1535) 
    at com.codename1.ui.Component.paintComponent(Component.java:1482) 
    at com.codename1.impl.CodenameOneImplementation.paintDirty(CodenameOneImplementation.java:588) 
    at com.codename1.impl.javase.JavaSEPort.paintDirty(JavaSEPort.java:1279) 
    at com.codename1.ui.Display.edtLoopImpl(Display.java:1077) 
    at com.codename1.ui.Display.mainEDTLoop(Display.java:999) 
    at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) 
    at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176) 
java.lang.ArrayIndexOutOfBoundsException: -1 
    at java.util.ArrayList.elementData(ArrayList.java:418) 
    at java.util.ArrayList.get(ArrayList.java:431) 
    at com.codename1.ui.Container.getComponentAt(Container.java:1551) 
    at com.codename1.ui.Tabs$1.actionPerformed(Tabs.java:573) 
    at com.codename1.ui.util.EventDispatcher.fireActionSync(EventDispatcher.java:459) 
    at com.codename1.ui.util.EventDispatcher.access$100(EventDispatcher.java:45) 
    at com.codename1.ui.util.EventDispatcher$CallbackClass.run(EventDispatcher.java:95) 
    at com.codename1.ui.Display.processSerialCalls(Display.java:1154) 
    at com.codename1.ui.Display.edtLoopImpl(Display.java:1098) 
    at com.codename1.ui.Display.flushEdt(Display.java:886) 
    at com.codename1.ui.Form.showModal(Form.java:1762) 
    at com.codename1.ui.Dialog.showModal(Dialog.java:1085) 
    at com.codename1.ui.Dialog.show(Dialog.java:553) 
    at com.codename1.ui.Dialog.showPackedImpl(Dialog.java:1389) 
    at com.codename1.ui.Dialog.showPacked(Dialog.java:1297) 
    at com.codename1.ui.Dialog.showImpl(Dialog.java:1041) 
    at com.codename1.ui.Dialog.show(Dialog.java:1019) 
    at com.codename1.ui.Dialog.show(Dialog.java:975) 
    at com.codename1.ui.Dialog.show(Dialog.java:764) 
    at com.codename1.ui.Dialog.show(Dialog.java:717) 
    at com.codename1.ui.Dialog.show(Dialog.java:682) 
    at com.codename1.ui.Dialog.show(Dialog.java:623) 
    at com.codename1.ui.Dialog.show(Dialog.java:778) 
    at com.codename1.ui.Display.mainEDTLoop(Display.java:1012) 
    at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) 
    at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176) 

だからすべてのタブを閉じるための正しい方法は何ですか?

closeAll()がsheduled Runnableから呼び出された場合にのみ、

例外がスローされました。タブをスライドさせた後、タブを閉じるにはRunnableを使用します。

答えて

1

これがうまくいく場合は、すべて削除元がどこにあるかを確認して、それをcallSerially()でラップすることをおすすめします。 2つの潜在的な障害があります。

  • EDT違反
  • イベントキューがまだタブが両方とも問題がcallSeriallyで解決されますが

さに依存している実行するためのタスクを持っています。

関連する問題