2015-10-17 143 views
0

我在使用JFrame实现JLabel时遇到问题。当按下“学习”按钮时,程序需要在屏幕中央显示“你好”或“世界”。此外,这是一个闪存卡程序,当学习按下时,一个字放在屏幕的中间,程序假设从用户输入的文本字段中读取并打印它是对还是错。问题在于程序在按下学习之后正在读取文本字段,因此在用户输入答案之前它将打印为假。JLabel未出现在JFrame中

有人可以简要解释为什么这不起作用,我可以做些什么来解决这个问题?

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

什么不工作? – mezmi

回答

3

您要添加的标签,你frame,但你已经在frame的顶部增加了一个JPanel。解决方案是将标签添加到panel而不是frame

因此改变:frame.add(label);panel.add(label);

+0

实际上,将面板添加到框架并不重要。这是BorderLayout,所以标签应该“替换”面板。我认为主要的问题是没有调用'revalidate()'。但我同意将标签添加到面板而不是帧(=到BorderLayout的中心,因此更换面板)是一个好主意。 –

+1

@LuxxMiner,'面板被添加到框架并不重要。“ - 是的。之前的组件不会被替换。当您使用revalidate()时,标签将被赋予一个大小/位置,所以现在将绘制两个组件。 Swing将首先添加最后添加的组件,因此标签将被绘制并且面板将被绘制在标签的顶部。由于面板不透明,因此会覆盖标签。看看我的答案在这里:http://stackoverflow.com/questions/30361149/why-does-the-first-panel-added-to-a-frame-disappear/30362786#30362786一个更完整的解释。 – camickr

2

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

因此,为了使其工作,您需要将标签添加到除中心以外的其他位置,或者将面板添加一些其他显式区域。如果将附加,例如,

所以:

frame.add(label, BorderLayout.NORTH); 

它将工作 - 但你一定不要忘记还补充:

frame.revalidate(); 

每当组件添加到您的GUI ,当你全部添加它们时,你应该调用它,以便根据需要重新构建组件的层次结构。

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