Java JLabel不会出现在JFrame中

Java JLabel不会出现在JFrame中,java,swing,jframe,jlabel,Java,Swing,Jframe,Jlabel,使用JFrame实现JLabel时遇到问题。按下“学习”按钮时,程序需要在屏幕中央显示“Hello”或“World”。这也是一个抽认卡程序,当按下“学习”按钮时,一个单词被放在屏幕的中间,该程序将从文本字段中读取,以供用户输入,并打印是否正确。问题是,程序在按下研究键后读取文本字段,因此在用户输入答案之前,它打印的是false 有人能简要解释一下为什么这不起作用,以及我能做些什么来解决这个问题吗 import java.awt.event.ActionEvent; import java.awt

使用JFrame实现JLabel时遇到问题。按下“学习”按钮时,程序需要在屏幕中央显示“Hello”或“World”。这也是一个抽认卡程序,当按下“学习”按钮时,一个单词被放在屏幕的中间,该程序将从文本字段中读取,以供用户输入,并打印是否正确。问题是,程序在按下研究键后读取文本字段,因此在用户输入答案之前,它打印的是false

有人能简要解释一下为什么这不起作用,以及我能做些什么来解决这个问题吗

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;

public class NoteCardGUI implements ActionListener {

public static JFrame frame;
public static JPanel panel;
public static JLabel label;
private NoteCard ex;
private JButton study;

public static Box box1 = new Box(), box2 = new Box(), box3 = new Box();

public NoteCardGUI() {
    ex = new NoteCard("Hello", "World");

    frame = new JFrame("Flash Card");
    panel = new JPanel();

    study = new JButton("Study");


    study.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String resp = NoteCard.getResponse(ex);
            String chal = NoteCard.getChallenge(ex);
            String a = text.getText();

            label = new JLabel(chal, label.CENTER);
            label.setAlignmentX(0);
            label.setAlignmentY(0);
            frame.add(label, BorderLayout.SOUTH);
            frame.revalidate();

            if(resp.compareTo(a) == 0)
            {
                label = new JLabel("Correct!");
            }
            label = new JLabel("Incorrect");
        }
    });

    panel.add(study);

    frame.add(panel);
    frame.setSize(500, 500);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

}

public static void main(String[] args) {

    new NoteCardGUI();
}

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub

}

}

您正在将标签添加到
框架
,但您已经在
框架
顶部添加了一个
JPanel
。解决方案是将标签添加到
面板
,而不是
框架


所以改变:
frame.add(标签)
面板。添加(标签)

您正在将标签添加到
框架
,但您已经在
框架
顶部添加了一个
JPanel
。解决方案是将标签添加到
面板
,而不是
框架


所以改变:
frame.add(标签)
面板。添加(标签)

默认情况下,
JFrame(或者更确切地说,它的内容窗格)具有。这意味着,如果在不指定约束的情况下向其添加组件,它们将被添加到
中心
。但是您不能在任何
边界布局
的区域添加多个元素

因此,为了使其工作,您需要将标签添加到中心以外的其他位置,或者使用其他明确区域添加面板

因此,如果将“添加”更改为,例如:

frame.add(label, BorderLayout.NORTH);
它将起作用,但您不能忘记添加:

frame.revalidate();
无论何时向GUI添加组件,都应该在添加完所有组件后调用此函数,以便根据需要重建组件的层次结构


另一个选项是更改框架的布局管理器,或者添加到面板。

默认情况下,
JFrame(或者更确切地说,它的内容窗格)具有。这意味着,如果在不指定约束的情况下向其添加组件,它们将被添加到
中心
。但是您不能在任何
边界布局
的区域添加多个元素

因此,为了使其工作,您需要将标签添加到中心以外的其他位置,或者使用其他明确区域添加面板

因此,如果将“添加”更改为,例如:

frame.add(label, BorderLayout.NORTH);
它将起作用,但您不能忘记添加:

frame.revalidate();
无论何时向GUI添加组件,都应该在添加完所有组件后调用此函数,以便根据需要重建组件的层次结构


另一个选项是更改框架的布局管理器,或添加到面板。

实际上,面板添加到框架并不重要。它是边界布局,所以标签应该只是“替换”面板。我认为主要的问题是没有调用
revalidate()
。但我同意将标签添加到面板而不是框架(=添加到
边框布局的中心,因此替换面板)是一个好主意。@LuxxMiner,
将面板添加到框架并不重要。
-是的。以前的部件不会被更换。使用revalidate()时,标签将指定一个大小/位置,因此现在将绘制两个组件。Swing将首先绘制最后添加的组件,因此标签将被绘制,面板将被绘制在标签的顶部。由于面板是不透明的,它将覆盖标签。看看我的答案:更完整的解释。实际上,面板被添加到框架中并不重要。它是边界布局,所以标签应该只是“替换”面板。我认为主要的问题是没有调用
revalidate()
。但我同意将标签添加到面板而不是框架(=添加到
边框布局的中心,因此替换面板)是一个好主意。@LuxxMiner,
将面板添加到框架并不重要。
-是的。以前的部件不会被更换。使用revalidate()时,标签将指定一个大小/位置,因此现在将绘制两个组件。Swing将首先绘制最后添加的组件,因此标签将被绘制,面板将被绘制在标签的顶部。由于面板是不透明的,它将覆盖标签。看看我的答案:为了更完整的解释。什么不起作用?什么不起作用?