Javaのループ中のメモリの動きについて
以下のソースはテキストフィールドに文字列を張り付けると、特定の文字を置き換えて、カットするものです。
アクションイベント内で、無限ループをして待ち受ける処理をしていますが、メモリーが使われすぎてパソコンに負担がかかるのではと思っています。
見た目では影響ないようですし、カタカタ音はなりません。
しかし念のため数値でこれを把握したいです。
どのような測定方法があるかご存じの方がおられましたら教えてください。
(また、根本的にプログラムがNGであれば、ご指摘いただきたいです)
public class test_1 extends Frame implements ActionListener {
public static void main(String[] args) {
new test_1();
}
JTextField a = new JTextField();
JLabel b = new JLabel("Ctl + C", JLabel.CENTER);
JButton b1 = new JButton();
String name;
ClosingListener c = new ClosingListener();
public test_1() throws HeadlessException {
super();
this.setTitle("日時の/と:を取り除く");
this.setSize(400, 150);
this.addWindowListener(c);
a.setFont(new Font("", Font.BOLD, 30));
a.setFocusable(true);
a.putClientProperty("caretAspectRatio", Float.valueOf(0.3F));
a.setForeground(Color.cyan);
a.setBackground(Color.yellow);
b.setBackground(Color.white);
b.setFont(new Font("", Font.BOLD, 30));
b.setPreferredSize(new Dimension(150, 150));
b1.addActionListener(this);
this.add(a, BorderLayout.CENTER);
this.add(b, BorderLayout.WEST);
this.setVisible(true);
b1.doClick();
}
class ClosingListener extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
public void actionPerformed(ActionEvent e) {
while (true) {
if ((a.getText().length() == 15) == true) {//文字の置き換え
name = a.getText();
name = name.replaceAll("/", "_");
name = name.replaceAll(":", "_");
// name.substring(0, 16);
System.out.println("name==" + name);
a.setText(name);
a.requestFocusInWindow();
a.selectAll();
a.cut();
} else if (a.getText().equals("")) {//空文字はスルー
} else {//15文字以外はエラー
JOptionPane.showConfirmDialog(this, "日時は**文字です。", "確認",
JOptionPane.DEFAULT_OPTION);
a.requestFocusInWindow();
a.selectAll();
a.cut();
}
}
}
}
No.2ベストアンサー
- 回答日時:
#1です。
>なんとか待ち受け状態の機能を考えようと
>してこうなってしまいました。
気持ちはわかります。
そして、全く的外れというわけでもありません。
事実、C言語でWindowsアプリケーションを一からゴリゴリ書こうと思えば、似たようなことをしなくてはいけません。
しかし、プログラマーがそういうことをしなくていいのが、イベント駆動型プログラミングです。
「スレッドを無限ループで回し、コンポーネントの状態変化を監視し続ける」というアイデアでしょうが、そもそもそれは、イベントディスパッチスレッドのお仕事です。
たとえば、ボタンのActionイベントは、使ったことがあるようなので、それを思い出してみてください。
無限ループの中で、マウスポインタの位置とマウスボタンの状態を常時監視し、JButtonの位置で、マウスボタンが押されたら、JButtonがクリックされたと判断する、なんて、やったでしょうか?
それをするのは、イベントディスパッチスレッドであり、イベントディスパッチスレッドは、条件が合致すると、それに対応したイベントをトリガします。
プログラマーは、それに対応した、イベントリスナーをあらかじめ登録しておけば、よいと言うことです。
さて、今回のことで言えば、JTextField のテキストの変化を監視したいと言うことなので、それに見合ったイベントがあるか、探すべきです。
JTextField はちょっとややこしいのですが、APIドキュメントを読めば、ちゃんと書いてあります。
調べてみてください。
重要なヒントをありがとうございます。
意味が理解できました。
さっそくJTextFieldのイベントリスナーを使って書き直します。
いつもアドバイスありがとうございます。
No.1
- 回答日時:
こんにちは。
コードを一目見て、「これはフリーズして動かないだろう」と思ったのですが、期待通りの動きではないにせよ、動くには動いたので、びっくりしました。
なんかいろいろ創意工夫の後が見られて、何とか動かそうと言う「その意気やよし」とは思いますが、残念ながら根本的に間違っています。
もうすこし、イベント駆動型プログラミングの基礎を勉強しなおしましょう。
でも、まあ、迷走するというのは、悪い事じゃないですよ。
今回のような迷い道に入り込んでから、基礎をやり直せば、イベント駆動のありがたみが身にしみるというものですよ。
この回答への補足
いつもありがとうございます。
なんとか待ち受け状態の機能を考えようとしてこうなってしまいました。
イベントではなくスレッドで起動しなければならないということでしょうか。
イベント駆動型プログラミングはActionListenerやMouseListenerなどよく使うのですが、
イベント駆動のどのような部分の基礎のことなのか解りません。
(スレッドの働きのようなものでしょうか)
ヒントを頂けませんでしょうか。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java final 1 2022/06/10 22:49
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Ruby vscode 文字化け 1 2022/05/21 19:17
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
C#でのWNetAddConnection3の使...
-
長方形を描いて、それを移動さ...
-
未割り当てのローカル変数
-
ボタンの複数割り当てについて
-
C#から、C++で作成したdll内の...
-
C# 矢印キーの取得
-
JavaSwingのファンクションキー...
-
StrutsのiterateタグでListに格...
-
C# タスク非表示でタイトルバー...
-
C# visibleプロパティをfalseに...
-
[C#.net]スレッド化された別フ...
-
C#で別のFormへ複数の値を返そ...
-
System.err. printlnとSystem.o...
-
C言語のポインターに関する警告
-
VBAで配列の計算
-
[JAVA]try 内の変数を外で!?
-
Javaで改行などが出来ないのです。
-
ORA-01858: 数値を指定する箇所...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
Junitテストでvoid戻り値メッソ...
-
C#で、あるクラスのメンバーす...
-
C#でのWNetAddConnection3の使...
-
C# visibleプロパティをfalseに...
-
unityでのC++エラーの原因がわ...
-
ボタンの複数割り当てについて
-
C#で別のFormへ複数の値を返そ...
-
エンターキーを押すとOKボタン...
-
LVM_SETITEMSTATEでListViewの...
-
ユーザーコントロールを動的に...
-
[C#.net]スレッド化された別フ...
-
C# 矢印キーの取得
-
C#から、C++で作成したdll内の...
-
C# DataGridView列カスタマイズ
-
C#でキーイベントが発生しない...
-
Thread.sleepのInterruptedExce...
-
C#でのオブジェクトのコピーに...
-
C# 半角カナの文字化けについて
-
文字列の置換
おすすめ情報