質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

774閲覧

プログラムのリスナーの行数を短くできるか

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2019/06/10 21:54

編集2019/06/10 23:20

#実現したいこと
テキストフィールドを10個作り、テキストフィールド上でEnterキーもしくはtabキーを押すとフォーカスが移動するプログラムを作っているのですが、リスナー部分(36行目~85行目)とリスナーをテキストフィールドに登録する部分(24行目~33行目)の行数を短くすることはできますか?可能ならその方法を教えてください。
#該当のソースコード

java

1import java.awt.FlowLayout; 2import java.awt.event.ActionEvent; 3import java.awt.event.ActionListener; 4 5import javax.swing.JFrame; 6import javax.swing.JTextField; 7 8public class enshu64 { 9 JTextField[] tf; 10 11 public static void main(String arg[]) { 12 new enshu64(); 13 } 14 public enshu64(){ 15 JFrame f; 16 f=new JFrame(); 17 f.getContentPane().setLayout(new FlowLayout()); 18 f.setSize(300,200); 19 tf=new JTextField[10]; 20 for(int i=0; i<10; i++){ 21 tf[i]=new JTextField(10); 22 f.getContentPane().add(tf[i]); 23 } 24 tf[9].addActionListener(new enshu64entera()); //リスナーをテキストフィールドに登録 25 tf[0].addActionListener(new enshu64enterb()); 26 tf[1].addActionListener(new enshu64enterc()); 27 tf[2].addActionListener(new enshu64enterd()); 28 tf[3].addActionListener(new enshu64entere()); 29 tf[4].addActionListener(new enshu64enterf()); 30 tf[5].addActionListener(new enshu64enterg()); 31 tf[6].addActionListener(new enshu64enterh()); 32 tf[7].addActionListener(new enshu64enteri()); 33 tf[8].addActionListener(new enshu64enterj()); 34 f.setVisible(true); 35 } 36 class enshu64entera implements ActionListener{ //リスナーの作成 37 public void actionPerformed(ActionEvent e){ 38 tf[0].requestFocusInWindow(); 39 } 40 } 41 class enshu64enterb implements ActionListener{ 42 public void actionPerformed(ActionEvent e){ 43 tf[1].requestFocusInWindow(); 44 } 45 } 46 class enshu64enterc implements ActionListener{ 47 public void actionPerformed(ActionEvent e){ 48 tf[2].requestFocusInWindow(); 49 } 50 } 51 class enshu64enterd implements ActionListener{ 52 public void actionPerformed(ActionEvent e){ 53 tf[3].requestFocusInWindow(); 54 } 55 } 56 class enshu64entere implements ActionListener{ 57 public void actionPerformed(ActionEvent e){ 58 tf[4].requestFocusInWindow(); 59 } 60 } 61 class enshu64enterf implements ActionListener{ 62 public void actionPerformed(ActionEvent e){ 63 tf[5].requestFocusInWindow(); 64 } 65 } 66 class enshu64enterg implements ActionListener{ 67 public void actionPerformed(ActionEvent e){ 68 tf[6].requestFocusInWindow(); 69 } 70 } 71 class enshu64enterh implements ActionListener{ 72 public void actionPerformed(ActionEvent e){ 73 tf[7].requestFocusInWindow(); 74 } 75 } 76 class enshu64enteri implements ActionListener{ 77 public void actionPerformed(ActionEvent e){ 78 tf[8].requestFocusInWindow(); 79 } 80 } 81 class enshu64enterj implements ActionListener{ 82 public void actionPerformed(ActionEvent e){ 83 tf[9].requestFocusInWindow(); 84 } 85 } 86} 87

#実行結果
イメージ説明
#回答を受けてコードの書き換え
回答を受けて、以下のようにコードを書き換えてみましたが、今度は21行目に「varを型に解決できません」というエラーが出ます。

java

1import java.awt.FlowLayout; 2import java.awt.event.ActionEvent; 3import java.awt.event.ActionListener; 4 5import javax.swing.JFrame; 6import javax.swing.JTextField; 7 8public class enshu64 { 9 JTextField[] tf; 10 11 public static void main(String arg[]) { 12 new enshu64(); 13 } 14 public enshu64(){ 15 JFrame f; 16 f=new JFrame(); 17 f.getContentPane().setLayout(new FlowLayout()); 18 f.setSize(300,200); 19 tf=new JTextField[10]; 20 for(int i = 0; i < tf.length; ++i){ 21 final var tmp_tf = new JTextField(10); //varを型に解決できません。 22 tmp_tf.addActionListener( 23 e -> tmp_tf.requestFocusInWindow() 24 ); 25 26 tf[i] = tmp_tf; 27 f.getContentPane().add(tf[i]); 28 } 29 f.setVisible(true); 30 } 31 32}

--

reraNine👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Java

1for(int i = 0; i < tf.length; ++i){ 2 final var tmp_tf = new JTextField(10); 3 tmp_tf.addActionListener( 4 e -> tmp_tf.requestFocusInWindow() 5 ); 6 7 tf[i] = tmp_tf; 8 f.getContentPane().add(tf[i]); 9}

enshu64entera, enshu64enterb, ... は不要です。

投稿2019/06/10 22:10

編集2019/06/10 22:26
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/10 22:41

w・) 配列に突っ込むのも不要じゃね。リスナー追加するために対応してるっぽいし
LouiS0616

2019/06/10 22:57

かもしれないですね。 ただ細かいところ突っ込みだすと切りが無さそうなので...
退会済みユーザー

退会済みユーザー

2019/06/10 23:22

あなたの回答を受けてコードを書き換えました。書き換え後のコードは質問画面に編集で追加しました。しかし、今度は「varを型に解決できません」というエラーが出ます。どうしたらいいでしょうか?
LouiS0616

2019/06/10 23:27

varは型推論のキーワードで、ものすごく簡潔に言うと『めんどくさい型宣言を省略できる機能』です。 Java10より前のバージョンをご利用なら、略さずに final JTextField tmp_tf = new JTextField(10); と書いて下さい。
退会済みユーザー

退会済みユーザー

2019/06/11 01:12

final JTextField tmp_tf = new JTextField(10); にしたら実行できました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問