У меня есть класс 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). Я еще не добавляю вкладку в 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