2013-07-14 2 views
2

나는 내 프로그램을위한 GUI를 설정하려고하고 있으며 대부분 작동하고있다. 그러나, 나는 스캐너의 nextLine()과 같이 작동하는 메서드를 만들 수 있기를 원합니다. 내 JTextField에서 입력을 기다린 다음 반환합니다. this question은 내 것과 매우 비슷하지만 사용자의 입력을 기다리지 않았던 것 같습니다.스캐너와 같은 JTextField 내용 검색

package util; 

import java.awt.Font; 
import java.awt.BorderLayout; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JScrollPane; 
import com.jgoodies.forms.factories.DefaultComponentFactory; 

public class Gui { 

    public JFrame frame; 
    private JTextField textField; 
    private final JLabel lblVector = DefaultComponentFactory.getInstance().createTitle("Please type commands below."); 
    private JScrollPane scrollPane; 
    private JTextArea textArea; 

    /** 
    * Create the application. 
    */ 
    public Gui() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    public void print(String text){ 
     textArea.append(text+"\n"); 
    } 
    public String getInput() 
    { 
     String input = textField.getText(); 
     textField.setCaretPosition(0); 
     return input; 
    } 
    private void initialize() { 
     frame = new JFrame("Vector"); 
     frame.setBounds(100, 100, 720, 720); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     textField = new JTextField(); 
     frame.getContentPane().add(textField, BorderLayout.SOUTH); 
     textField.setColumns(10); 
     frame.getContentPane().add(lblVector, BorderLayout.NORTH); 

     scrollPane = new JScrollPane(); 
     frame.getContentPane().add(scrollPane, BorderLayout.CENTER); 

     textArea = new JTextArea(); 
     textArea.setFont(new Font("Monospaced", Font.PLAIN, 15)); 
     textArea.setEditable(false); 
     scrollPane.setViewportView(textArea); 
    } 
} 

내가 그렇게처럼 호출 할 수 싶습니다 : 여기 내 GUI의 현재 코드

String menus = gui.getInput(); 

또는은; 이미 gui 변수를 새로운 Gui()로 설정했습니다.

필자가 검색 한 결과, 아마도 DocumentListener 또는 ActionListener 중 하나 또는 둘 모두와 관련이 있습니다.

답변

4

ActionListener을 텍스트 필드에 추가하십시오. 텍스트 필드에 포커스가 있고 사용자가 을 입력하면을 입력하면 이벤트가 발생합니다. 자세한 내용은 How to Write an Action Listener을 참조하십시오. 모든 사람의 도움을

public String getInput() throws InterruptedException 
{ 
    final CountDownLatch latch = new CountDownLatch(1); 
    KeyEventDispatcher dispatcher = new KeyEventDispatcher() { 
     // Anonymous class invoked from EDT 
     public boolean dispatchKeyEvent(KeyEvent e) { 
      if (e.getKeyCode() == KeyEvent.VK_ENTER) 
       latch.countDown(); 
      return false; 
     } 
    }; 
    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(dispatcher); 
    latch.await(); // current thread waits here until countDown() is called 
    KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(dispatcher); 
    String input = textField.getText(); 
    textField.setCaretPosition(0); 
    return input; 
} 

감사 :

+0

감사합니다. 그러나이 이벤트가 actionPerformed()에서 시작되어 내 함수에서 반환 할 수 없다는 것을 의미하지는 않습니까? 내 코드에서 완전히 별개의 파일에서이 함수를 호출합니다. – user1796160

+0

@ user1796160 : [java.beans.EventHandler] (http://docs.oracle.com/)를 사용하는 [접근] (https://www.dropbox.com/s/3cso39hh1efpcls/Skeleton1.java)을 시도 할 수 있습니다. javase/7/docs/api/java/beans/EventHandler.html), 같은 thingy와 함께, 귀하의 말한 기능, 인수로 ActionEvent'을 가져와야하고 공개 (내가 추측)이 작동하도록해야합니다. –

+0

@nIcEcOw 나는 다른 파일에서 실제로 그것을 어떻게 호출 할까? – user1796160

-1

는 검색 조금 후에, 나는 내 대답 this question 발견!

+0

다른 사람들이 볼 수있는 위험에 대해서만이 투표를해야했습니다. '가는 길'. 그것은 아니야 .. –

+0

@AndrewThompson 그것은 나를 위해 작동하며 제시된 다른 대안들 중 어느 것도 이해할 수 없다. 이것은 내가 요구 한 것을 충족시킨다. – user1796160