2014-01-16 101 views
1

我在類「ClientGUI.java」中創建了我的GUI,並試圖在另一個類(「Client.java」)中創建一個實例。 GUI只包含兩個按鈕(「前進」和「後退」),其中一次只有一個按鈕。 起初,GUI似乎工作正常,因爲框架是用一個按鈕顯示的。但是,一旦按下按鈕,它就會消失,不會被第二個按鈕取代。 通過設置斷點,我發現調用了正確的ActionListener函數,並刪除了第一個按鈕,但沒有添加第二個按鈕。從另一個類運行GUI

的GUI類 「ClientGUI.java」:

package GUI; 

import javax.swing.JPanel; 
import java.awt.Dimension; 
import javax.swing.JButton; 
import java.net.MalformedURLException; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ClientGUI extends JPanel implements ActionListener { 

    private static JButton btnForward = new JButton("Forward"), 
      btnBackward = new JButton("Backward"); 

    public static void main(String[] args) {   
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        createAndShowGUI(); 
       } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public ClientGUI() throws MalformedURLException { 
     setLayout(new BorderLayout()); 

     add(btnForward, BorderLayout.CENTER); 

     btnForward.addActionListener(this); 
     btnBackward.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) {   
     if (e.getSource() == btnForward) { 
      remove(btnForward); 

      add(btnBackward, BorderLayout.CENTER); 

      revalidate(); 
      repaint(); 
     } 

     else if (e.getSource() == btnBackward) { 
      remove(btnBackward); 

      add(btnForward); 

      revalidate(); 
      repaint(); 
     } 
    } 

    private static void createAndShowGUI() throws MalformedURLException { 
     JFrame frame = new JFrame("ClientGUI"); 

     frame.setMinimumSize(new Dimension(500, 400)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new ClientGUI()); 

     frame.setSize(500, 400); 
     frame.setVisible(true); 
    } 
} 

和類 「Clients.java」 從中我想使用的GUI:

import java.net.*; 
import GUI.ClientGUI; 

public class Client { 

    public static void main(String[] args) { 
     Client client = new Client(); 
    } 

    Client() { 
     String[] args = {"ggg", "vvv"}; 

      try { 
       new ClientGUI().main(args); 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
    } 
} 

感謝您的幫助。

+3

使用CardLayout ... – mKorbel

+0

你不應該叫'init'。來自另一班。你應該從構造函數中調用它。在你的情況下,它可能不起作用,因爲你的類在一個JPanel中,你添加到'init'中的框架,所以如果你從構造器調用'init',你會得到一個無限循環。看到我的答案。我只是做了一些簡單的修復。但是,在良好的實踐方面,還有更多可以改進的地方。 –

+0

@mKorbel我在想同樣的事情,但OP不想使用兩個分離幀。這個問題看起來像這樣,但OP只是試圖從加載GUI的另一個類運行GUI類。 –

回答

4
  1. 永遠不要調用main方法。 main方法是讓JVM知道程序的入口點。
  2. 請勿使用兩種main方法。無論哪個入口點程序,只有main方法只有在那個
  3. 只需使用構造函數。當第一個GUI調用第二個時,構造函數中的所有內容都將被構造。

這是一個改進版本。有用。

  • 我從ClientGUI
  • 擺脫main的我在Client類稱爲ClientGUI.createAndShowGUI()main

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.net.*; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Client { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Client(); 
      } 
     }); 
    } 

    Client() { 
     String[] args = {"ggg", "vvv"}; 

     try { 
      ClientGUI.createAndShowGUI(); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

class ClientGUI extends JPanel implements ActionListener { 

    private static JButton btnForward = new JButton("Forward"), 
      btnBackward = new JButton("Backward"); 



    public ClientGUI() throws MalformedURLException { 
     setLayout(new BorderLayout()); 

     add(btnForward, BorderLayout.CENTER); 

     btnForward.addActionListener(this); 
     btnBackward.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == btnForward) { 
      remove(btnForward); 

      add(btnBackward, BorderLayout.CENTER); 

      revalidate(); 
      repaint(); 
     } else if (e.getSource() == btnBackward) { 
      remove(btnBackward); 

      add(btnForward); 

      revalidate(); 
      repaint(); 
     } 
    } 

    public static void createAndShowGUI() throws MalformedURLException { 
     JFrame frame = new JFrame("ClientGUI"); 

     frame.setMinimumSize(new Dimension(500, 400)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new ClientGUI()); 

     frame.setSize(500, 400); 
     frame.setVisible(true); 
    } 
} 
+0

感謝您的解釋和代碼示例! 我假設SwingUtilities.invokeLater在客戶端類的主要方法中被調用? – user3202098

+0

是的,當我添加SwingUtilities時,我無意中刪除了'main'。 **修正** –

+0

再次感謝您的快速響應。所有不良做法我認爲主要問題是「新的ClientGUI()。main(args);」。如果該行改爲「ClientGUI.main(args);」 (或CreateAndShow方法)它已經工作。你能解釋一下在那裏創建一個ClientGUI對象到底是什麼問題嗎? – user3202098