私は、Windowsコマンドプロンプトまたはターミナルと同様に機能するプログラムを作成しようとしています。これは基本的に、JTextAreaoutput
がinput
。でJTextFieldが。のJFrameです。これは次のようになります。
プログラムが次のような文字列を返すメソッドを呼び出すたびに、JTextFieldから入力を取得できるようにしたいです。
public static String getInput() {
//Wait for user to enter something, then press the enter key
}
エンターキーが押されたときに何かを実行できるようにAbstractActionを追加しましたが、メソッドを呼び出すたびに入力を文字列として返す方法を理解できました。
Action action = new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e) {
//Clears the JTextField
input.setText("");
}
};
私のような何か入れることができますuserInput = input.getText()
ではpublic void actionPerformed()
それだけで変数を設定しますので、毎回、使用に入ってきたものは何でも、userInput
私がしたい時はいつでも、私は、ユーザーが画面上にいただきました!を読む時間を持ちたい、その後のためのプログラムウェイトを持っています彼らがすぐに入力した最後のものを使用するのではなく、応答。
私は次のuserInput
ような変数とブール変数を使おうとしました:
private static String userInput = "";
private static boolean enterPressed = false;
Action action = new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e) {
userInput = input.getText()
enterPressed = true;
input.setText("");
}
};
...
public static String getInput() {
enterPressed = false;
while(!enterPressed){
//Do Nothing
}
enterPressed = false;
return userInput;
}
私が電話したときoutput.setText(getInput());
、それwhile(!enterPressed){}
は私のプロセッサを必要以上に難しくしたことを除いて、私が望んでいたように機能しました。これを行うには、おそらくもっと良い方法があると確信しています。
これが今の私のコード全体です:
public class ConsoleFrame {
//Objects for Console Frame
JFrame frame = new JFrame();
JTextArea output = new JTextArea();
JTextField input = new JTextField();
BoxLayout boxLayout = new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS);
JScrollPane scrollPane = new JScrollPane(output);
DefaultCaret caret = (DefaultCaret)output.getCaret();
Action action = new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e) {
input.setText("");
}
};
ConsoleFrame(){
input.addActionListener(action);
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
frame.setLayout(boxLayout);
frame.add(scrollPane);
frame.add(input);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 250);
frame.setLocationRelativeTo(null);
input.setMaximumSize(new Dimension(Integer.MAX_VALUE, 10));
output.setEditable(false);
output.setAutoscrolls(true);
}
public static String getInput() {
return null;
}
}
では、ユーザーがEnterキーを押すまで、電話をかけるたびにプログラムを停止するにはどうすればよいgetInput();
でしょうか。
プログラムが次のような文字列を返すメソッドを呼び出すたびに、JTextFieldから入力を取得できるようにしたいです。
エンターキーが押されたときに何かを実行できるようにAbstractActionを追加しましたが、メソッドを呼び出すたびに入力を文字列として返す方法を理解できました。
public String getInput() {
return input.getText();
}
では、getInput();を呼び出すたびに、ユーザーがEnterキーを押すまで、プログラムを停止するにはどうすればよいでしょうか。
あなたはしません。Swingは、ほとんどのUIフレームの動作と同様に、イベント駆動型です。つまり、何かが発生し、それに応答します。
したがって、そのことを念頭に置いて、ある種のオブザーバーパターンの使用を検討する必要があります。このパターンでは、コールバックを使用してActionListener
、たとえば、関心のあるある種の変更を通知します。
代わりに、関係者が登録し、フィールドが変更されたときに通知する、ある種のリスナーを提供することができます。
import java.util.EventListener;
import java.util.EventObject;
public class InputEvent extends EventObject {
private final String text;
public InputEvent(Object source, String text) {
super(source);
this.text = text;
}
public String getText() {
return text;
}
}
public interface InputObsever extends EventListener {
public void inputChanged(InputEvent evt);
}
これで、入力が変更/更新されるたびに通知されるオブザーバーができました。
次に、イベントを登録解除/登録して起動する方法が必要です...
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.event.EventListenerList;
import javax.swing.text.DefaultCaret;
public class ConsoleFrame {
//Objects for Console Frame
JFrame frame = new JFrame();
JTextArea output = new JTextArea();
JTextField input = new JTextField();
BoxLayout boxLayout = new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS);
JScrollPane scrollPane = new JScrollPane(output);
DefaultCaret caret = (DefaultCaret) output.getCaret();
Action action = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
fireInputChanged(input.getText());
input.selectAll();
}
};
private EventListenerList listenerList = new EventListenerList();
ConsoleFrame() {
input.addActionListener(action);
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
frame.setLayout(boxLayout);
frame.add(scrollPane);
frame.add(input);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 250);
frame.setLocationRelativeTo(null);
input.setMaximumSize(new Dimension(Integer.MAX_VALUE, 10));
output.setEditable(false);
output.setAutoscrolls(true);
}
public String getInput() {
return input.getText();
}
public void addInputObsever(InputObsever obsever) {
listenerList.add(InputObsever.class, obsever);
}
public void removeInputObsever(InputObsever obsever) {
listenerList.remove(InputObsever.class, obsever);
}
protected void fireInputChanged(String text) {
InputObsever[] listeners = listenerList.getListeners(InputObsever.class);
if (listeners.length > 0) {
InputEvent evt = new InputEvent(this, text);
for (InputObsever obsever : listeners) {
obsever.inputChanged(evt);
}
}
}
}
ここでのポイントは、テキストがいつ入力/変更されたかを知りたい場合は、オブザーバーをインスタンスに登録することです。 ConsoleFrame
console.addInputObsever(new InputObsever() {
@Override
public void inputChanged(InputEvent evt) {
// Do what ever you need to do...
}
});
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加