2016-04-19 15 views
-1

私はjavaの初心者ですので、これは愚かな質問かもしれません。ユーザーがEnterを押すまで私のプログラムを止めたいです。私はActionListenerを実装しましたが、キーが押されています。私が考えることができるのは、while条件を実装することですが、動作しないようです。GUIを介してユーザーの入力を待っています

public class main { 

static JTextField field; 
static int x; 
public static void main (String [] args) 
{ 
    JFrame frame = new JFrame("frame"); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel panel = new JPanel(); 
    frame.add(panel); 
    field = new JTextField("field"); 
    panel.add(field); 
    field.addActionListener(new action()); 
    while(x==0)//i want my program to stop here ,wait for user enter input and then output below message 
    JOptionPane.showMessageDialog(null, "show message after user has preseed enter"); 

} 
static public class action implements ActionListener 
{ 

    public void actionPerformed(ActionEvent e) { 

     if(e.getSource() == field) 
     { 
      JOptionPane.showMessageDialog(null, "user pressed enter"); 
      x=1; 
     } 

    } 

} 

}

+0

GUIのHow to Make Dialogsを見てくださいので、単一のスレッドスイング、イベントドライバですので、任意のブロックまたは長い台無し操作はUIを停止し、更新またはユーザー入力に応答してから防ぐことができます。あなたがしようとしているものに基づいて、何らかの種類のモーダルダイアログを使うことをお勧めします。 – MadProgrammer

答えて

1

のGUIので、シングルスレッドスイング、イベント駆動であるため、任意のブロックまたは長い台無し操作がUIを停止し、更新またはユーザ入力に応答して防止します。

これを達成するにはいくつかの方法がありますが、ActionListenerがトリガーされたときにイベント通知を受け取るために何らかのオブザーバーパターンを使用することはできますが、いくつかの種類のモーダルダイアログを使用することをお勧めします。

詳細

import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JDialog frame = new JDialog((JFrame)null, "Help", true); 
       frame.add(new FieldPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 

       JOptionPane.showMessageDialog(null, "This is after the dialog is closed"); 
      } 
     }); 
    } 

    public class FieldPane extends JPanel { 

     public FieldPane() { 
      setLayout(new GridBagLayout()); 
      JTextField field = new JTextField(20); 
      add(field); 
      field.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        SwingUtilities.windowForComponent(FieldPane.this).dispose(); 
       } 
      }); 
     } 

    } 

} 
+0

私はあなたのコード – shujaat

+0

を試して、はいJOptionPane.showMessageDialog(null、 "これはダイアログが閉じた後です")です。 ヘルプウィンドウを閉じた後に実行されますが、プログラムがthat.Isをどのように実行するのか理解できません。なぜなら、ユーザーが「ヘルプ」ダイアログを閉じるまでプログラムが待機するからです。 – shujaat

+0

そして、オブザーバーのパターンでそれをどうやって行うのかを教えてください。どこでもサンプルコードがあれば私に指示してください。私はYouTubeで多くのチュートリアルを見ましたが、これは分かりやすいようです(https://www.youtube .com/watch?v = 56A_YY5frjo)彼はまったく別のもののためにオブザーバーパターンを使用しています。 – shujaat

関連する問題