【问题标题】:Difficulty displaying several JTextFields and JLabels inside JPanel难以在 JPanel 中显示多个 JTextField 和 JLabel
【发布时间】:2013-12-21 01:07:41
【问题描述】:

我在 JPanel 中为我正在制作的刽子手游戏创建多个 JTextField 和 JLabel 时遇到了困难。我试图在 JLabel 中将用户输入显示为“使用的字母”。我已经评论了下面没有显示的区域。提前致谢。

/*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

【问题讨论】:

    标签: java swing jpanel jlabel jtextfield


    【解决方案1】:

    这段代码有很多地方是行不通的,还有很多地方让人困惑。

    直接的问题是面板 jp 是在 userInput() 中创建的,并且在那里添加了一些东西,但它本身并没有添加到框架或窗口或任何东西上。所以它不会显示。

    我建议将所有 UI“设置”代码放在一个地方——在用户输入任何内容之前设置整个窗口,使用空标签或文本字段或其他任何内容。这样一来,用户就不会“弹出” UI 控件,这令人不安,因为 GUI 很少以这种方式工作。

    这样也更容易确保包含您的控件的面板都已创建,布局管理器都已设置,并且控件已创建并放置在具有正确布局管理器的正确面板中,等等., 在你开始进入事件驱动逻辑之前。

    还有一点要注意——对 Swing UI 所做的任何更改都需要在“事件调度线程”上进行,如果您不知道那是什么,您需要阅读一两个教程,直到弄明白为止。


    按代码顺序:我发现最好创建一个容器面板,设置其布局管理器,然后创建将直接进入该面板并添加它们的项目。由于嵌套面板很常见,因此可以有多个层。

    我可能会将您将拥有的控件放在一个面板的顶部,并将该面板设置为框架上边框布局的“北”部分。然后我会为该边界布局的中心创建另一个面板,并将我想要的任何东西放在框架的可拉伸部分中。所以:创建框架,设置borderlayout(虽然实际上是默认设置),创建上部面板,设置布局,创建上部控件并添加它们,将该面板添加到北部的框架中,等等。

    我发现最好创建和添加一个动作例程以及该控件的其他特征(标签、颜色等)。事件驱动代码的挑战之一是,当您编写动作例程之类的东西时,您必须记住代码是在激活时应用程序状态的上下文中执行的;特别是对于匿名内部类,它需要您进行一些上下文转换。但对我来说最合乎逻辑的事情是用控件创建它。

    我不确定您还需要什么订单方面的帮助。祝你好运。

    【讨论】:

    • 你能帮我解决一下我的代码顺序吗?一段时间以来,我一直对此感到困难。
    猜你喜欢
    • 2021-06-07
    • 2019-07-08
    • 1970-01-01
    • 2018-04-18
    • 2016-08-29
    • 1970-01-01
    • 2013-04-06
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多