2

次のアプリケーションがあります。それは機能します、私はそれをよりよく理解しようとしています。
したがって、メインクラスから次の呼び出しを行います

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 オブジェクトウィンドウを作成し、すべての変数を初期化することです。

これは私には正しくないように思えます...しかし、何かが欠けているかどうかはわかりません。

アドバイス/ヘルプアレクシスをありがとう

4

2 に答える 2

3

まず、初期スレッドを見てみましょう

Guiクラスは少しぎこちないです...しかし、実行可能とはほど遠いものではありません...

UIのinitialize基本を作成startUIし、イベントディスパッチスレッドに切り替えGui、メインフレームの新しいインスタンスを作成して表示しています...

奇妙な部分は、 の 2 番目のインスタンスの作成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();} 
        }
    });
}

初期化される前にクラスの一部にアクセスできるようになったため、これはまだうまくいきません。代わりに、もっと似たようなことをしたいと思います...

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
}
于 2013-08-22T12:49:59.033 に答える
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();
}

}

余分なオブジェクトを作成しないため、より良い方法です。

于 2013-08-22T11:43:51.697 に答える