2015-10-17 119 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 ,當你全部添加它們時,你應該調用它,以便根據需要重新構建組件的層次結構。

另一種選擇是更改框架的佈局管理器或添加到面板。