Java 在JPanel中显示几个JTextFields和jLabel有困难
我很难在我的JPanel中创建几个JTextFields和jLabel,用于我正在制作的一个刽子手游戏。我试图在JLabel中将用户输入显示为“使用的字母”。我已经评论了下面没有显示的区域。提前谢谢Java 在JPanel中显示几个JTextFields和jLabel有困难,java,swing,jpanel,jlabel,jtextfield,Java,Swing,Jpanel,Jlabel,Jtextfield,我很难在我的JPanel中创建几个JTextFields和jLabel,用于我正在制作的一个刽子手游戏。我试图在JLabel中将用户输入显示为“使用的字母”。我已经评论了下面没有显示的区域。提前谢谢 /*PACKAGE DECLARATION*/ package Game; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; /************
/*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
这段代码有很多地方不起作用,也有很多地方令人困惑 直接的问题是,panel jp是在userInput()中创建的,并在那里添加了一些内容,但它本身并没有添加到框架、窗口或任何东西中。所以它不会显示出来 我建议将所有UI“设置”代码放在一个地方——在用户输入任何内容之前,设置整个窗口,其中包含空标签或文本字段或其他内容。这样,用户就不会“弹出”UI控件,这令人不安,因为GUI很少以这种方式工作 在开始进入事件驱动逻辑之前,更容易确保包含控件的面板都已创建,布局管理器都已设置,控件已创建并放置在具有正确布局管理器的正确面板中,等等 还有一个警告——对Swing UI所做的任何更改都需要在“事件调度线程”上进行,如果您不知道这是什么,则需要阅读一两篇教程,直到您弄明白为止
按照代码顺序:我发现最好创建一个容器面板,设置其布局管理器,然后创建直接进入该面板的项目并添加它们。由于嵌套面板很常见,因此可以有多个层 我可能会在一个面板的顶部放置控件,并将该面板设置为边框布局的“北”部分。然后,我会为边界布局的中心创建另一个面板,并在框架的弹性部分中放置我想要的任何东西。所以:创建框架,设置边框布局(虽然实际上这是默认设置),创建上面板,设置布局,创建上控件并添加它们,将面板添加到北部的框架中,等等 我发现最好创建并添加一个动作例程以及该控件的其他特性(标签、颜色等)。事件驱动代码的挑战之一是,当您编写动作例程之类的东西时,必须记住,代码在激活时是在应用程序状态的上下文中执行的;特别是对于匿名内部类,您需要进行一点上下文转换。但对我来说最合乎逻辑的事情是用控件创建它
我不知道你还需要什么帮助。祝你好运。你能帮我把代码的顺序再弄清楚一点吗?我在这方面有点困难已经有一段时间了。