我在使用JFrame实现JLabel时遇到问题。该程序需要显示" Hello"或"世界"按钮"研究"在屏幕中央。被压了。此外,这是一个闪卡程序,当按下学习时,在屏幕中间放置一个单词,并且程序假定从文本字段中读取用户输入并打印它是对还是错。问题是程序在按下学习后正在读取文本字段,因此在用户输入答案之前打印错误。
有人可以简单解释为什么这不起作用以及我可以采取哪些措施来解决这个问题?
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
}
}
答案 0 :(得分:3)
您要将标签添加到frame
,但您已在JPanel
之上添加了frame
。解决方案是将标签添加到panel
而不是frame
。
所以更改:frame.add(label);
改为panel.add(label);
答案 1 :(得分:2)
默认情况下,JFrame
(或更确切地说,其内容窗格)包含BorderLayout
。这意味着如果您在不指定约束的情况下向其添加组件,则会在CENTER
添加它们。但是你不能在任何BorderLayout
区域添加多个元素。
因此,为了使其正常工作,您需要在中心以外的其他位置添加标签,或者在面板中添加其他显式区域。
因此,如果您将添加更改为:
frame.add(label, BorderLayout.NORTH);
它会起作用 - 但你不要忘记也添加:
frame.revalidate();
每当您向GUI添加组件时,您应该在全部添加组件时调用它,以便它根据需要重建组件的层次结构。
另一种选择是更改框架的布局管理器,或添加到面板。