Java JLabel不会出现在JFrame中
使用JFrame实现JLabel时遇到问题。按下“学习”按钮时,程序需要在屏幕中央显示“Hello”或“World”。这也是一个抽认卡程序,当按下“学习”按钮时,一个单词被放在屏幕的中间,该程序将从文本字段中读取,以供用户输入,并打印是否正确。问题是,程序在按下研究键后读取文本字段,因此在用户输入答案之前,它打印的是false 有人能简要解释一下为什么这不起作用,以及我能做些什么来解决这个问题吗Java JLabel不会出现在JFrame中,java,swing,jframe,jlabel,Java,Swing,Jframe,Jlabel,使用JFrame实现JLabel时遇到问题。按下“学习”按钮时,程序需要在屏幕中央显示“Hello”或“World”。这也是一个抽认卡程序,当按下“学习”按钮时,一个单词被放在屏幕的中间,该程序将从文本字段中读取,以供用户输入,并打印是否正确。问题是,程序在按下研究键后读取文本字段,因此在用户输入答案之前,它打印的是false 有人能简要解释一下为什么这不起作用,以及我能做些什么来解决这个问题吗 import java.awt.event.ActionEvent; import java.awt
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将首先绘制最后添加的组件,因此标签将被绘制,面板将被绘制在标签的顶部。由于面板是不透明的,它将覆盖标签。看看我的答案:为了更完整的解释。什么不起作用?什么不起作用?