2014-11-20 3 views
1

я создал SelectMethodFrame, который расширяет JFrame, который может иметь только один экземпляр:экземпляр JFrame не визуализировать добавленного компонента

public class SelectMethodFrame extends JFrame { 

    private JSplitPane mainWindow = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); 

    public JSplitPane getMainWindow() { 
    return mainWindow; 
    } 

    public void setMainWindow(JSplitPane mainWindow) { 
    this.mainWindow = mainWindow; 
    } 

    private static SelectMethodFrame instance = null; 



    public static SelectMethodFrame getInstance() { 
    if (instance == null) 
     instance = new SelectMethodFrame(); 
    return instance; 
} 


    public void setTab(JComponent panelConsumption, JComponent panelCpu, 
     JComponent panelMemo, JComponent panelScreen, 
     JComponent panelMobile, JComponent panelWifi) { 

    TabbedView tab = new TabbedView(panelConsumption, panelCpu, panelMemo, 
      panelScreen, panelMobile, panelWifi); 


    mainWindow.setRightComponent(tab); 


} 

    public void setTree(JTree tree) { 

    mainWindow.setLeftComponent(new JScrollPane(tree)); 

    this.pack(); 
    this.setLocationRelativeTo(null); 
    this.setVisible(true); 

    getContentPane().add(mainWindow, java.awt.BorderLayout.CENTER); 
    setExtendedState(MAXIMIZED_BOTH); 
    setMinimumSize(new Dimension(800, 500)); 
    this.setTitle(Constants.APP_CHECKBOXTREE); 
    } 

} 

создать рамку в одном классе, таким образом:

SelectMethodFrame frame = new SelectMethodFrame(); 

frame.setTree(treeSelection); 

И все отлично работает, но когда я хочу добавить еще один компонент в свою рамку в другом классе:

SelectMethodFrame.getInstance().setTab(panelConsumption, panelCpu, 
    panelMemo, panelScreen, panelMobile, panelWifi); 

i t не показывает. Я пробовал с

SelectMethodFrame.getInstance().repaint(); 
SelectMethodFrame.getInstance().revalidate(); 

но он не работает. Он показывает компонент только в том случае, если он создан в конструкторе. В чем проблема?

Я изменил код и поставить:

общественного SelectMethodFrame() {

this.pack(); 
    this.setLocationRelativeTo(null); 
    this.setVisible(true); 

    getContentPane().add(mainWindow, java.awt.BorderLayout.CENTER); 
    setExtendedState(MAXIMIZED_BOTH); 
    setMinimumSize(new Dimension(800, 500)); 
    this.setTitle(Constants.APP_CHECKBOXTREE); 

} 

вместо этого в

public void setTree(JTree tree) { 

    mainWindow.setLeftComponent(new JScrollPane(tree)); 

    this.pack(); 
    this.setLocationRelativeTo(null); 
    this.setVisible(true); 

    getContentPane().add(mainWindow, java.awt.BorderLayout.CENTER); 
    setExtendedState(MAXIMIZED_BOTH); 
    setMinimumSize(new Dimension(800, 500)); 
    this.setTitle(Constants.APP_CHECKBOXTREE); 
    } 

теперь открывает его в другом кадре, но показывает только добавили последний компонент , Это так странно.

+0

может быть связано? http://stackoverflow.com/questions/22577924/jframe-with-tabs-is-not-being-displayed – Seephor

ответ

1

Вы не правильно используете шаблон singleton.

В SelectMethodFrame классе установите конструктор как частное:

public class SelectMethodFrame extends JFrame { 
    private SelectMethodFrame(){} 
    ... 
} 

И во всех ссылках на синглтон внутри класса, вместо this, использовать переменную instance, как:

instance.pack(); 
instance.setLocationRelativeTo(null); 
instance.setVisible(true); 
//etc... 

Таким образом, вы не можете вызвать new SelectMethodFrame() извне. Таким образом, вместо того, чтобы:

SelectMethodFrame frame = new SelectMethodFrame(); 

Вы должны использовать:

SelectMethodFrame frame = SelectMethodFrame.getInstance(); 

Это позволяет избежать создания более одного экземпляра класса.

Смежные вопросы