2013-12-21 42 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