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

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

新規登録して質問してみよう
ただいま回答率
85.48%
標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1109閲覧

forの中のtextfieldに入力した内容を表示できない

Beginner.java

総合スコア1

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/10/25 08:53

編集2021/10/25 10:07

現在javaを用いて割り勘をしてくれるシステムを作ろうとしています。それにあたって、textfieldで名前の入力欄を設けて入力した値をJLabelで表示するコードを作成いたしました。しかし、フィールドが初期化されてしまっているせいか、何も表示されない結果となっています。どなたかお力添えをいただけると助かります。

細かい説明(下記コードを参照)
ソースコード1の12行目のforの部分でtextfieldを任意の数生成できるシステムを組み、入力した値を15行目のgetTextで取得できるコードを記入した。forの中の値を参照することができないため、あらかじめフィールドとしてソースコード1の4行目にあるString strを作成した。そしてソースコード2の6行目でそれを表示しようとしても白紙になってしまう。

該当のソースコード

Java

ソースコード1

import

1 2public class ChangeNumberPractice extends JPanel { 3 String str; 4 JLabel label = new JLabel("入力した人数をテキストボックスの数に変える"); 5 6 public ChangeNumberPractice(PanelPracticeNumber ppn){ 7 this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 8 this.add(label); 9 String textNumber = ppn.getText(); 10 int tn = Integer.parseInt(textNumber); 11 for(int i = 0; i < tn; i++){ 12 JTextField text = new JTextField(); 13 this.add(text); 14 str = text.getText(); 15 } 16 this.add(new ButtonInCnp(ppn)); 17 System.out.println(str); 18 } 19}

ソースコード2

import

1 2public class PanelInCnp extends JPanel{ 3 JLabel label = new JLabel("記入した名前の表示"); 4 public PanelInCnp(ChangeNumberPractice cnp){ 5 JLabel nameLabel = new JLabel(cnp.str);→1の方のフィールドの値を表示 6 this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 7 this.add(label); 8 this.add(nameLabel); 9 } 10}

試したこと

switch-caseで動的でないtextfieldも設けたが、そちらも結局は値が表示されなかった。
例case1: jtextfield text1 = new jtextfield();
String str = text1.getText();
break;

補足情報(FW/ツールのバージョンなど)

versionはjava11
その他質問があればぜひぜひお尋ねください。

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

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

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

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

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

y_waiwai

2021/10/25 09:40

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
Beginner.java

2021/10/25 10:07

ご指摘ありがとうございます。変更いたしました。
dodox86

2021/10/25 10:28

現状ご提示されているコードは断片的なものだと思いますが、問題を再現できる最低限の全体の動くコードを示した方が良いと思います。どのタイミング、例えばボタンを押したときに入力した値(文字列)を取得したいのかなどが分かりません。
jimbe

2021/10/25 10:49 編集

> 12行目のforの部分でtextfieldを任意の数生成できるシステムを組み、入力した値を15行目のgetTextで取得できるコード > JTextField text = new JTextField(); > this.add(text); > str = text.getText(); ユーザが何の入力も出来ない(パネルの表示さえされていない)画面生成の段階で getText しても意味が無いでしょう。 プログラムの動作イメージが GUI になっていないようです。 そもそもといいますか、普通に割り勘なら合計金額を人数で割るだけで、個々人の名前など不要に思いますが、どういうプログラムにされるのでしょう。
Beginner.java

2021/10/27 14:35

数々のご指摘ありがとうございます。説明不足な点は申し訳ありません。後日より分かりやすい形でGUIの画像を含めて再提示させていただきます。 イメージとしては、金額と人数を入力したら、人名ごとに料金を表示するという感じです。 例:2000円と人数を入力し決定ボタンを押す→次に立て替えてもらった人を選択する(今回は2000円を4人が立て替えてもらったという想定) aさん500円 bさん500円 cさん500円 dさん500円 を表示するといった感じです。最終的には、これまで入力した額をまとめて表示してくれるというイメージです。 合計額 aさん1500円 bさん3000円 cさん2000円 dさん900円 作る意味は全くもってありません。あくまで目的は勉強です。
jimbe

2021/10/27 14:43

> 最終的には、これまで入力した額をまとめて表示してくれる 最終的…というのは、例えば一か月間に色々なグループで飲み会をした割り勘を月末に「あの日はaさんbさんで3000円、別の日はbさんcさんdさんで5000円、…でそれぞれの割り勘の合計は…」で清算という感じでしょうか。
Beginner.java

2021/10/27 14:54

ご質問ありがとうございます。 どちらかと言えばもう少し短期間の想定です。例えば、友人と2泊、3泊の旅行とかで払った代金の精算とかを目的としていました。
jimbe

2021/10/27 15:14 編集

なるほど。そうすると人数的にもせいぜい数人想定でしょうか。名前は登録制にして選択する感じも良さそうですね。 計算は(入力間違いを考えなければ)何かボタンを押したら即加算できるでしょうから、名前とその人の合計のリストは常に表示状態にして、割り勘対象はそこから選択(チェックボックス)とし、名前追加のパネルを常に出しておき必要なら名前をリストに追加して選択、割り勘対象金額とボタンを付けて金額を入力してボタンを押したらリストの選択されている人たちに割り勘が合計される・・・とすればダイアログ等無くても一通りの処理が出来そうです。
Beginner.java

2021/10/27 23:46

@jimbeさん ご回答ありがとうございます。さっそく動作確認をしてみます。 ご指摘ありがとうございます。ある程度作り方が分かるようになりましたら、そちらのイメージで試してみます。
guest

回答1

0

ベストアンサー

非常にざっくりとですが、 人数をスピナーで選択してセットボタンを押すと指定した数の TextField が表示され、そこに入力すると最下部の TextField に各入力が "," 区切りで表示されるようにしてみました。

ただ、このような場合はリストにしたほうが良いように思います。

java

1package teratail_java.q366141; 2 3import java.awt.BorderLayout; 4import java.awt.Rectangle; 5import java.awt.event.ActionEvent; 6import java.awt.event.ActionListener; 7import java.util.*; 8 9import javax.swing.*; 10import javax.swing.event.DocumentEvent; 11import javax.swing.event.DocumentListener; 12 13public class Q366141 extends JFrame { 14 public static void main(String[] args) { 15 new Q366141().setVisible(true); 16 } 17 18 Q366141() { 19 super("割り勘?"); 20 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 21 setBounds(new Rectangle(300,300)); 22 23 JPanel northPanel = new JPanel(null); 24 northPanel.setLayout(new BoxLayout(northPanel, BoxLayout.X_AXIS)); 25 JLabel numberOfPeopleLabel = new JLabel("人数:"); 26 northPanel.add(numberOfPeopleLabel); 27 JSpinner numberOfPeopleSpinner = new JSpinner(new SpinnerNumberModel(2, 2, 10, 1)); 28 northPanel.add(numberOfPeopleSpinner); 29 JButton numberOfPeopleButton = new JButton("セット"); 30 northPanel.add(numberOfPeopleButton); 31 add(northPanel, BorderLayout.NORTH); 32 33 JPanel centerPanel = new JPanel(null); 34 centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS)); 35 add(centerPanel, BorderLayout.CENTER); 36 37 JTextField namesField = new JTextField(""); 38 namesField.setEditable(false); 39 add(namesField, BorderLayout.SOUTH); 40 41 Coordinator coordinator = new Coordinator(new Coordinator.Listener() { 42 @Override 43 public void onChangeNames(String[] names) { 44 StringJoiner sj = new StringJoiner(","); 45 for(String name : names) sj.add(name); 46 namesField.setText(sj.toString()); 47 } 48 }); 49 50 numberOfPeopleButton.addActionListener(new ActionListener() { 51 @Override 52 public void actionPerformed(ActionEvent e) { 53 centerPanel.removeAll(); 54 coordinator.clear(); 55 56 int n = (Integer)(numberOfPeopleSpinner.getValue()); 57 for(int i=0; i<n; i++) { 58 JTextField nameField = new JTextField(); 59 coordinator.add(nameField); 60 nameField.getDocument().addDocumentListener(coordinator); 61 centerPanel.add(nameField); 62 } 63 centerPanel.revalidate(); 64 } 65 }); 66 } 67 68 static class Coordinator implements DocumentListener { 69 interface Listener { 70 void onChangeNames(String[] names); 71 } 72 private List<JTextField> nameFieldList = new ArrayList<>(); 73 private Listener listener; 74 Coordinator(Listener l) { 75 this.listener = l; 76 } 77 void add(JTextField nameField) { 78 nameFieldList.add(nameField); 79 } 80 void clear() { 81 nameFieldList.clear(); 82 listener.onChangeNames(new String[0]); 83 } 84 private String[] getNames() { 85 String[] names = new String[nameFieldList.size()]; 86 int i = 0; 87 for(JTextField field : nameFieldList) { 88 names[i++] = field.getText(); 89 } 90 return names; 91 } 92 @Override 93 public void insertUpdate(DocumentEvent e) { 94 listener.onChangeNames(getNames()); 95 } 96 @Override 97 public void removeUpdate(DocumentEvent e) { 98 listener.onChangeNames(getNames()); 99 } 100 @Override 101 public void changedUpdate(DocumentEvent e) { 102 listener.onChangeNames(getNames()); 103 } 104 } 105} 106

投稿2021/10/27 14:50

jimbe

総合スコア12632

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

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

Beginner.java

2021/10/28 09:33

@jimbeさん ご回答ありがとうございます。何から何まで本当に助かりました。また、機会があればぜひご教授いただけますと幸いです。本日はお忙しいところありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問