2013-12-21 86 views
0

我在創建幾個JTextFields和JLabel時,很難在我的JPanel中創建一個hang子手遊戲。我試圖在JLabel中將用戶輸入顯示爲「使用的字母」。我評論過下面不顯示的區域。提前致謝。難以在JPanel內部顯示幾個JTextFields和JLabels

/*PACKAGE DECLARATION*/ 
package Game; 


import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 


/************************ 
* GAME MECHANICS CLASS * 
* **********************/ 
public class GameMechanics { 


    /* STATIC DECLARATIONS */ 
    static JPanel jp;//panel 
    static JLabel jl;//label 
    static JTextField tf;//text field 
    static String input = ""; 


    /********************* 
    * USER INPUT METHOD * 
    * *******************/ 
    public void userInput() { 

     jp = new JPanel(); 
     jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS)); 
     jl = new JLabel("Enter a Letter");//prompt with label 
     tf = new JTextField(null);//length of text field by character 
     jp.add(jl);//add label to panel 
     jp.add(tf);//add text field to panel 


     tf.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 

      JTextField tf = (JTextField)e.getSource(); 
      input = tf.getText();//get user input 
      JLabel jl2 = new JLabel("Letters Used: " + input);//NOT DISPLAYING 
      jp.add(jl2);//NOT DISPLAYING 

      }//end actionPerformed method 

     }); 

    }//end userInput method 


    /***************** 
    * WINDOW METHOD * 
    * ***************/ 
    public void window() { 

    LoadImageApp i = new LoadImageApp();//calling image class 
    JFrame gameFrame = new JFrame();//declaration 
    gameFrame.add(i); //adds background image to window 
    i.add(jp); // adds panel containing label to background image panel 
    gameFrame.setTitle("Hangman");//title of frame window 
    gameFrame.setSize(850, 600);//sets size of frame 
    gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//exit when 'x' button pressed 
    gameFrame.setIconImage(new ImageIcon("Hangman-Game-grey.png").getImage());//set the frame icon to an image loaded from a file 
    gameFrame.setLocationRelativeTo(null);//window centered 
    gameFrame.setResizable(false);//user can not resize window 
    gameFrame.setVisible(true);//display frame 

    }//end window method 

}//end GameMechanics class 








/*PACKAGE DECLARATION*/ 
package Game; 


/*********************** 
* IMPORT DECLARATIONS * 
* *********************/ 
import java.awt.Graphics; 
import javax.swing.ImageIcon; 
import javax.swing.JPanel; 


/*************** 
* IMAGE CLASS * 
* *************/ 
public class LoadImageApp extends JPanel { 

    private static final long serialVersionUID = 1L; 

     private ImageIcon image; 


     /*********************** 
     * PAINT IMAGE METHOD * 
     * *********************/ 
     public void paintComponent (Graphics g) { 

      super.paintComponent(g); 
      image = new ImageIcon("hangman.png");//image name & type 
      image.paintIcon(this, g, 0, 9); 

     }//end paintComponent method 

}//end LoadImageApp class 










/*PACKAGE DECLARATION*/ 
package Game; 


/******************* 
* GAME MAIN CLASS * 
* *****************/ 
public class GameMain { 


    /*************** 
    * MAIN METHOD * 
    * *************/ 
    public static void main (String []args) { 

     GameMechanics game = new GameMechanics();//declaration 
     game.userInput();//userInput call 
     game.window(); 

    }//end main method 

}//end GameMain class 

回答

2

關於這段代碼有很多事情是行不通的,還有一些關於它的事情令人困惑。

直接的問題是panel jp是在userInput()中創建的,並且在那裏添加了一些東西,但它本身不會添加到框架或窗口或任何東西。所以它不會顯示。

我建議您在一個位置設置所有UI「設置」代碼 - 在用戶需要輸入任何內容之前,設置整個窗口,包含空標籤或文本字段或任何其他內容。這樣,用戶就沒有UI控件「彈出」他,這是令人不安的,因爲GUI很少以這種方式工作。

確保包含您的控件的面板全部都已創建並且佈局管理器都已設置,並且使用正確的佈局管理器創建並放置到正確的面板中,等等,然後再開始進入事件驅動的邏輯。

還有一點要小心 - 對「Swing UI」所做的任何更改都需要在「事件派發線程」上發生,如果您不知道這是什麼,則需要閱讀一兩個教程,直到找出它。


在代碼的順序:我覺得最好創建一個容器板,設置它的佈局管理器,然後創建項目,將直接進入該面板內添加。由於嵌套面板很常見,因此可以有多個圖層。

我可能會在一個面板的頂部放置控件,並將該面板設置爲框架上邊框佈局的「北部」部分。然後,我會爲該邊框佈局的中心創建另一個面板,並將所需的任何內容放在框架的有彈性部分。所以:創建框架,設置borderlayout(雖然實際上它是默認設置),創建上面板,設置佈局,創建上層控件並添加它們,將該面板添加到框架中,等等。

我覺得最好創建並添加一個動作例程以及該控件的其他特徵(標籤,顏色等)。事件驅動代碼的一個挑戰是,當你編寫一個類似於一個動作例程的東西時,你必須記住,代碼是在激活時在應用程序狀態的上下文中執行的;特別是對於匿名內部類,它需要您的部分上下文轉換。但對我而言,最合乎邏輯的就是用控制器來創造它。

我不知道還有什麼你想要的幫助順序。祝你好運。

+0

你能幫我解決一下我的代碼嗎?一段時間以來我一直都很困難。 – Anon