Имам клас VTreePanel, който се разширява от CPanel, който се разширява от JPanel. Класът има обект 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). Все още не добавям никакъв Tab в tabbedPane. Вижте екранната снимка по-долу:
http://i45.tinypic.com/2v3j0nl.jpg
Тогава как да добавя раздела, когато потребителят щракне върху едно от менютата?
Имам клас AMenu, където е имплементирал PropertyChangeListener, който задейства метода propertyChange, когато потребителят кликне върху меню:
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 съдържа логика, която извършва добавяне на Tab в JTabbedPane (не забравяйте, че обектът 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() се изпълнява, но изобщо не се показва раздел.
Някой знае ли как да поправя този проблем?
EventQueue.isDispatchThread()
навсякъде, където не сте сигурни дали методът се извиква от контекста на EDT и искате да актуализирате потребителския интерфейс - person MadProgrammer   schedule 18.10.2012