2013-08-22 71 views
2

我有以下應用程序。它的工作原理,我只是想更好地理解它。
因此,從主類我做以下調用試圖瞭解GUI Swing和線程

public static void main(String[] args) 
{ 
Gui gui = new Gui(); 
gui.startGui();  
} 

在上面的代碼的GUI類

public Gui() 
{ 
initialize(); 
} 

private void initialize() 
{ 
mainWinFrm = new JFrame(); 
mainWinFrm.setTitle("Inventory Tool"); 

JMenuBar menuBar = new JMenuBar(); 
mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH); 
.....//allot more GUI staff getting initialize 
} 

public void startGui() 
{ 
    try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());} 
    catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {} 
    EventQueue.invokeLater(new Runnable() 
    { 
    public void run() 
    { 
     try 
     { 
     Gui window = new Gui(); 
     window.mainWinFrm.setLocationRelativeTo(null); 
     window.mainWinFrm.setMinimumSize(new Dimension(400, 200)); 
     window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.mainWinFrm.pack(); 
     window.mainWinFrm.setVisible(true);    
     } 
    catch (Exception e) 
    {e.printStackTrace();} 
    } 
}); 
} 

結構由一個GUI建設者建立,我想我試圖理解發生了什麼。

,我不明白主要的一點是,當我們構造對象GUI在主類它初始化所有的變量,然後啓動該線程gui.startGui()該方法還創建了一個新的GUI對象窗口並初始化所有變量。

這似乎不適合我...但後來我不知道如果我失去了一些東西。

感謝您的意見/幫助 亞歷克西斯

+2

看看[初始線程(http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) – MadProgrammer

+1

具有初始化方法和startGui方法沒有意義。 startGui方法是啓動Swing UI的正確方法 – MadProgrammer

+1

看起來不正確 - 「Gui」對象被創建兩次:第一次在'main'中,第二次在'startGui'中。也許'startGui'應該被聲明爲'static'並且被稱爲'Gui.startGui()'。什麼工具建立這個代碼? – Joni

回答

3

開始採取一看Initial Threads

Gui類是一個有點尷尬......但被可行不遠處......

initialize這是創建UI的基礎知識,在startUI它切換到事件調度線程,使得Gui一個新實例,顯示主框架...

這是奇怪的部分是Gui二審在startUI創作。相反,你可以做這樣的事情......

public Gui() 
{ 
    // It's arguable, but I'm paranoid, so I prefer to do anything related 
    // to the UI within the EDT... 
} 

private void initialize() 
{ 
    mainWinFrm = new JFrame(); 
    mainWinFrm.setTitle("Inventory Tool"); 

    JMenuBar menuBar = new JMenuBar(); 
    mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH); 
    .....//allot more GUI staff getting initialize 
} 

public void startGui() 
{ 
    try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());} 
    catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {} 
    EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      try 
      { 
       // Initialize here instead... 
       initialize(); 
       window.mainWinFrm.setLocationRelativeTo(null); 
       window.mainWinFrm.setMinimumSize(new Dimension(400, 200)); 
       window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       window.mainWinFrm.pack(); 
       window.mainWinFrm.setVisible(true);    
      } 
      catch (Exception e) 
       {e.printStackTrace();} 
     } 
    }); 
} 

這仍然沒有正確與坐,因爲現在它可能已經被initalised才訪問類的部分,而不是,我寧願做更多的東西一樣......

public static void main(String[] args) 
{ 
    EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      // Initialise the system look and feel... 
      try 
      { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) 
      { 
      } 
      Gui window = new Gui(); 
      window.mainWinFrm.setLocationRelativeTo(null); 
      window.mainWinFrm.setMinimumSize(new Dimension(400, 200)); 
      window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      window.mainWinFrm.pack(); 
      window.mainWinFrm.setVisible(true);    
     } 
    }); 
} 

public Gui() 
{ 
    initialize(); 
} 

private void initialize() 
{ 
    mainWinFrm = new JFrame(); 
    mainWinFrm.setTitle("Inventory Tool"); 

    JMenuBar menuBar = new JMenuBar(); 
    mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH); 
    .....//allot more GUI staff getting initialize 
} 
1

一個更好的辦法: GUI類:

public class Gui { 
private JFrame mainWinFrm; 

public Gui() { 
    initialize(); 

} 

private void initialize() { 
    mainWinFrm = new JFrame(); 
    mainWinFrm.setTitle("Inventory Tool"); 

    JMenuBar menuBar = new JMenuBar(); 
    mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH); 

} 

public static void startGui() { 
    try { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } catch (Exception ex) { 
    } 

    try { 

     Gui window = new Gui(); 
     window.mainWinFrm.setLocationRelativeTo(null); 
     window.mainWinFrm.setMinimumSize(new Dimension(400, 200)); 
     window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.mainWinFrm.pack(); 
     window.mainWinFrm.setVisible(true); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

而且MainClass:

public class MainClass { 
public static void main(String[] args) 
{ 
Gui.startGui(); 
} 

}

這是更好的方法,因爲它不會創建任何額外的對象。

+0

我可能會試圖讓構造函數'protected'來防止任何機構意外地創建類 – MadProgrammer

+0

的實例,它只是一個提示,而不是最終的代碼。開發人員應始終採取預防措施,以使代碼高效穩健 – Bharat

+0

如果提示符合要點,請標記答案 – Bharat