2014-10-05 77 views
-1

我最近使用System.out.println()創建並完成了使用IDE處理IDE的程序的第一階段;什麼不是。現在,我想給這個程序一個GUI,我遇到了一個問題。這是我的MCV例子(或者至少我認爲是,如果不是,請告訴我)。如何在使用JTextField時等待用戶輸入

import java.net.*; 
import java.net.UnknownHostException; 
import java.net.NoRouteToHostException; 
import java.io.*; 
import net.sf.json.*; 
import org.apache.commons.lang.exception.*; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.JPanel; 
import javax.swing.SwingConstants; 
import javax.swing.BoxLayout; 
import javax.swing.JOptionPane; 
import java.awt.Component; 
import java.awt.Container; 
import java.util.Scanner; 


public class WOT_PlayerComp_V2 
{ 

    public static JFrame f; 
    public static JLabel resultLabel; 
    public static JPanel p; 
    public static JTextField t; 
    public static String comparisonResults = ""; 
    public static String holder = ""; 
    public static String playerName = ""; 
    public boolean gameIsStillRunning = true; 

    public static void testGUI() 
    { 
     f = new JFrame(); 

     addComponentsToPane(f.getContentPane()); 



     f.setSize(300, 400); 
     f.setLocation(200, 200); 
     // f.setResizable(false); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 

    } 

    public static void addComponentsToPane(Container c) 
    { 
     c.setLayout(new BoxLayout(c, BoxLayout.Y_AXIS)); 

     p = new JPanel(); 
     t = new JTextField(15); 
     //t.setDocument(new JTextField_wLimit(50)); 
     //You can ignore this line, it is what I used to limit the input of my textfield 
     resultLabel = new JLabel(); 


     //html makes the br have purpose, p makes it wrap 
     resultLabel.setHorizontalAlignment(SwingConstants.CENTER); 
     resultLabel.setVerticalAlignment(SwingConstants.TOP); 
     resultLabel.setSize(50, 50); 

     c.add(t); 
     c.add(resultLabel); 


    } 

    public WOT_PlayerComp_V2() 
    { 

     testGUI(); 

    //... Lots of irrelevant code 

     resultLabel.setText("Enter your username."); 

     while(gameIsStillRunning) 
     { 

     //irrelevant code 

     playerName = t.getText();//scans user input 
     t.setText(""); 

     //more irrelevant code 
     } 

     //if(playerName == null || playerName.equals("")) 
     //^^ it shouldn't go into here, I want my while loop to wait 
     //for user input like it did when i was using a Scanner object 
     // 

    } 

    public static void main(String[] args) 
    { 

     WOT_PlayerComp_V2 w = new WOT_PlayerComp_V2(); 

    } 

} 

基本上,在我使用JTextField對象之前,我使用了一個Scanner對象。 Scanner對象實際上會停止我的while循環並運行該方法,然後繼續。我想知道這是否可能與JTextField。我希望能夠在中間停止for循環並等待用戶輸入。它似乎沒有像我上面的MCV示例那麼大的問題,但我使用的代碼很大程度上依賴於輸入,並會響應用戶輸入null或空字符串。因此,它將完成它所要做的事情,響應正確的用戶輸入,並且這隻會持續一次迭代,然後它將繼續從JTextField獲取輸入,因爲它處於while循環中。這是我的問題。

+0

如果一切都失敗了,我可以用一個JButton採取輸入,但即使這樣,我仍然不知道如何停止while循環 – DreadHeadedDeveloper 2014-10-05 02:17:04

回答

2

GUI程序不像這樣工作,就像它們在控制檯程序中一樣。沒有「正在等待用戶輸入」就像使用Scanner一樣。隨着Swing,事件被來自用戶的不同交互觸發。這是您的工作,因爲程序員可以通過將適當的偵聽器添加到觸發您想要偵聽的事件的組件來偵聽這些事件。例如,您可以在文本字段上偵聽ActionEvent(當用戶擊中時輸入時會觸發該事件。您可以將ActionListener添加到將監聽這些事件的文本字段中,然後可以執行一些處理髮生事件。

final JTextField field = new JTextField(20); 
field.addActionListener(new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     String text = field.getText(); 
     System.out.println(text); 
     field.setText(text); 
    } 
}); 

請花一些時間去了Writing Event Listeners