【问题标题】:JTextField not appearing in JFrameJTextField 没有出现在 JFrame 中
【发布时间】:2024-01-10 08:08:01
【问题描述】:

我创建了一个游戏,它在屏幕上的随机位置生成图像 (JLabel)。单击时,图像会在不同的随机位置生成。我现在计划在屏幕上也有文字。我正在使用 JTextField 执行此操作。问题是 JTextField msg 没有出现,尽管它是使用与 JLabel box 相同的方法添加的。有人可以解释为什么它没有在 JFrame 中生成吗?

BoxGame:

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class BoxGame02 extends JFrame {

    static JLabel box       = new JLabel();
    static JTextField msg   = new JTextField();

    static int min          = 2;
    static int max          = 350;

    static Random random    = new Random();
    static int rand1        = min + random.nextInt(max - min + 1);
    static int rand2        = min + random.nextInt(max - min + 1);
    static int randMessage  = 1   + random.nextInt(10  -  1  + 1);

    public BoxGame02() {
        super("Click the Box!");
        setLayout(null);

        ImageIcon icon = new ImageIcon("C:/Users/btayl/JavaProjects/Java Game Development/Box Game/BoxGame02/Images/face.png");
        box.setIcon(icon);
        box.setSize(50,50);

        box.setLocation(rand1, rand2);
        add(box);

        msg.setText("Text on Screen");
        msg.setLocation(10, 200);
        add(msg);

        box.setName("box");
        BoxListener clickBox = new BoxListener();

        box.addMouseListener(clickBox);

    }

    class BoxListener extends MouseAdapter {

        public void mouseClicked(MouseEvent e) {
            JLabel l = (JLabel) e.getSource();

            if(l.getName().equals("box"))
                moveBox();
        }
    }
    public void moveBox() {
        System.out.println("Testing!");

        rand1            = min + random.nextInt(max - min + 1);
        rand2            = min + random.nextInt(max - min + 1);
        randMessage      = 1   + random.nextInt(10  -  1  + 1); 

        box.setLocation(rand1, rand2);
        add(box);

        revalidate();
        repaint();
    }
}

窗口:

public class Window {
    public static void main(String[] args) {

        BoxGame02 frame = new BoxGame02();
        frame.setSize(400, 400);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setVisible(true);
    }
}

【问题讨论】:

  • 你知道setLayout(null) 是做什么的吗?尝试使用布局管理器查看是否有变化...
  • 我将其设置为 null,以便我可以设置确切的坐标。我知道这不是构建程序的最佳方法,但我认为在这种情况下它可以正常工作。
  • in this case it works fine. - 如果标签的随机位置与文本字段重叠怎么办?您需要创建单独的面板。例如,您可以将文本字段添加到框架的 PAGE_START。然后创建一个单独的面板并将这个面板添加到框架的中心。然后将标签添加到第二个面板。现在标签的随机位置将永远不会与文本字段重叠。

标签: java swing jframe jtextfield


【解决方案1】:

尽管使用与 JLabel 框相同的方法添加了 JTextField 消息,但它没有出现。

不,您没有使用与标签相同的方法。再次仔细查看您的代码。

您在 JLabel 上使用了哪些方法?

现在比较一下用于 JTextField 的方法,看看有什么区别。

在您的“moveBox()”方法中,您不需要继续将框添加到面板中。您只需添加一次该框。然后你可以简单地改变它的位置。

您不应该使用静态变量。变量应该是类的实例变量。

【讨论】:

  • 我已经尝试在 moveBox() 和 mouseClicked() 方法中添加msg,但它仍然不起作用。你能提供更详细的解释吗?
  • @SputnicK,你说代码是一样的。所以告诉我,你在“box”变量上调用了哪些方法,在“msg”变量上调用了哪些方法。如果要使用 null 布局,则需要在每个组件上管理相同的属性。这是使用布局管理器的另一个原因。
  • 哦,我没有设置大小... 哎呀,我是个白痴。感谢您的帮助:)
  • @SputnicK,是的。同样,布局管理器的工作应该是设置组件的大小/位置。您不知道文本字段的大小应该是多少才能正确显示文本。此外,您不知道图像的大小。任何时候硬编码值都会遇到维护问题。即使您想要组件的随机位置,您仍然可以使用布局管理器。请参阅 Drag Layout 以获取帮助您的布局。
最近更新 更多