0

JPanelから拡張されたCPanelから拡張されたVTreePanelクラスがありますこのクラスには、左と右の2つの領域に分割されたJSplitPaneオブジェクトがあります。左側にはツリーメニュー選択オブジェクトが含まれています。右側には、JTabbedPaneオブジェクトが含まれています。VTreePanelクラスは次のようになります。

public final class VTreePanel extends CPanel
    implements ActionListener
{
    private JSplitPane centerSplitPane = new JSplitPane();

    private JTabbedPane tabbedPane;

    ...

    // GET method for the tabbedPane    
    public JTabbedPane getTabbedPane() {
        return tabbedPane;
    }

    // Constructor
    public VTreePanel(int WindowNo, boolean hasBar, boolean editable)
    {

        ...

        tabbedPane = new JTabbedPane();
        centerSplitPane.add(treePart, JSplitPane.LEFT);
        centerSplitPane.add(tabbedPane, JSplitPane.RIGHT);  // Look at this

        ...
    }

}

コンストラクターで、ツリー選択(treePart)とJTabbedPaneオブジェクト(tabbedPane)をJSplitPaneオブジェクト(centerSplitPane)に追加しました。tabbedPaneにはまだタブを追加していません。以下のスクリーンショットを見てください。

http://i45.tinypic.com/2v3j0nl.jpg

次に、ユーザーがメニューの1つをクリックしたときに、タブを追加するにはどうすればよいですか?

ユーザーがメニューをクリックしたときにpropertyChangeメソッドを起動するPropertyChangeListenerを実装したAMenuクラスがあります

public final class AMenu extends CFrame
    implements ActionListener, PropertyChangeListener, ChangeListener
{

    private VTreePanel treePanel = null;    // this is the VTreePanel object

    ...

    public void propertyChange(PropertyChangeEvent e)
    {
        ...

        // Here I pass the VTreePanel object as parameter to AMenuStartItem thread object
        (new AMenuStartItem(cmd, true, sta, this, treePanel)).start();
    }

}

VTreePanelオブジェクト(treePanel)があり、VTreePanelオブジェクトをパラメーターとしてAMenuStartItemスレッドに渡すことがわかります。AMenuStartItemには、JTabbedPaneにTabを追加するロジックが含まれています(JTabbedPaneオブジェクト(tabbedPane)はVTreePanelにあることに注意してください)。

AMenuStartItemスレッドクラスは次のとおりです。

public class AMenuStartItem extends Thread implements ActionListener
{
    private VTreePanel m_vtreePanel;

    public AMenuStartItem (int ID, boolean isMenu, String name, AMenu menu, VTreePanel vtreepanel)
    {
        ...

        m_vtreePanel = vtreepanel;  // save the VTreePanel object
    }

    // The thread method that executed when thread is started
    public void run()
    {
        ...

        startWindow(0, cmd);

        ...
    }

    private void startWindow(int AD_Workbench_ID, int AD_Window_ID)
    {
        ...

        // Here I perform adding new tab
        m_vtreePanel.getTabbedPane().addTab(frame.getTitle(), frame.getAPanel());

        ...
    }

}

そのため、getTabbedPane()はJTabbedPaneオブジェクトを返し、addTab()メソッドが実行されましたが、タブはまったく表示されませんでした。

誰かがこの問題を解決する方法を知っていますか?

4

1 に答える 1

1

UIとのすべての対話は、例外なしで、イベントディスパッチスレッドを介して実行する必要があります。

public class AMenuStartItem extends Thread implements ActionListener
{
    private VTreePanel m_vtreePanel;

    public AMenuStartItem (int ID, boolean isMenu, String name, AMenu menu, VTreePanel vtreepanel)
    {
        ...

        m_vtreePanel = vtreepanel;  // save the VTreePanel object
    }

    // The thread method that executed when thread is started
    public void run()
    {
        ...

        startWindow(0, cmd);

        ...
    }

    private void startWindow(final int AD_Workbench_ID, final int AD_Window_ID)
    {
        ...

        if (EventQueue.isDispatchingThread()) {
            // This is safe, we're in the EDT
            m_vtreePanel.getTabbedPane().addTab(frame.getTitle(), frame.getAPanel());
            m_vtreePanel.getTabbedPane().invalidate();
            m_vtreePanel.getTabbedPane().repaint();
        } else {
            // This is unsafe, we need to resync with the EDT
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    // Here I perform adding new tab
                    m_vtreePanel.getTabbedPane().addTab(frame.getTitle(), frame.getAPanel());
                    m_vtreePanel.getTabbedPane().invalidate();
                    m_vtreePanel.getTabbedPane().repaint();

                }
            });
        }

        ...
    }

}
于 2012-10-18T04:37:16.893 に答える