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

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

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

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

Q&A

解決済

2回答

3698閲覧

TextAreaに入力してもらった値を取得したい。

TA-KEY

総合スコア21

Java

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

0グッド

0クリップ

投稿2018/01/31 08:10

編集2018/01/31 08:10

タイトルの通りです。
このクラスは、プレイヤーに練習メニューを選んでもらい、練習を実行するという流れなのですが、TextAreaにプレイヤーに記入してもらったあと、エンターキーで読み込むにはどうしたらいいんでしょうか。
現状Mainメソッドを呼び出しても動きません。

一応流れとしては、Frame1クラスのフレームを作り、その後Frame1からこのMainメソッドを呼び出そうとしています。

java

1 2public class Main extends JFrame implements MouseListener{ 3 4 public static void main(String args[]){ 5 Frame1 frame1 = new Frame1("パワプロくん"); 6 frame1.setVisible(true); 7 } 8 9 public JTextArea mainArea; 10 Scanner input = new Scanner(System.in); 11 JMenuItem menuitem1; 12 JMenuItem menuitem2; 13 JMenuItem menuitem3; 14 String userName = ""; 15 16 ByteArrayOutputStream bytes = new ByteArrayOutputStream() { 17 public synchronized void flush() throws IOException { 18 mainArea.setText(toString()); 19 } 20 }; 21 22 PrintStream out = new PrintStream(bytes, true); 23 24 Main(String title, String name){ 25 userName = name; 26 this.setTitle(title); 27 this.setSize(624, 580); 28 this.setLocationRelativeTo(null); 29 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 30 this.addMouseListener(this); 31 32 JPanel pane1 = new JPanel(); 33 ImageIcon icon1 = new ImageIcon("背景.jpg"); 34 JLabel label1 = new JLabel(icon1); 35 pane1.add(label1); 36 37 JPanel pane2 = new JPanel(); 38 39 mainArea = new JTextArea(""); 40 mainArea.setPreferredSize(new Dimension(580, 150)); 41 mainArea.setEditable(true); 42 mainArea.setLineWrap(true); 43 mainArea.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); 44 45 pane2.add(mainArea); 46 47 JPanel pane3 = new JPanel(); 48 49 pane3.add(pane1); 50 pane3.add(pane2); 51 pane3.add(menubar); 52 Container con = this.getContentPane(); 53 con.add(pane3); 54 55 Story(userName); 56 } 57 58 private void Story(String name) { 59 userName = name; 60 Hero h = new Hero(userName); 61 System.setErr(out); 62 System.setOut(out); 63 System.out.println(userName + "「嫌な夢にうなされたな、、、」"); 64 System.out.println(userName + "「でも確かにその通りだ。今日から必死に練習しよう」"); 65 boolean done = false; 66 boolean doit = false; 67 int mon = 9; 68 int day = 1; 69 Scanner scanner = new Scanner(System.in); 70 while(!done){ 71 String Days = mon + "月" + day + "日"; 72 while(!doit){ 73 bytes.reset(); 74 mainArea.setText(""); 75 System.out.println(Days); 76 System.out.println("(1)筋力, (2)打撃, (3)守備, (4)投げ込み, (5)変化球, (6)走り込み"); 77 try{ 78 System.out.println("今日はどうしようか(練習番号を入力): "); 79 int cmd = scanner.nextInt(); 80 if(cmd >= 1 && cmd <= 6){ 81 doit = true; 82 h.practice(cmd); 83 done = true; 84 } 85 else{ 86 bytes.reset(); 87 mainArea.setText(""); 88 System.out.println("練習する気がないのか!"); 89 } 90 }catch(InputMismatchException e) { 91 bytes.reset(); 92 mainArea.setText(""); 93 System.out.println("練習する気がないのか!"); 94 } 95 }//while(doit) 96 } 97 } 98}

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

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

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

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

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

KSwordOfHaste

2018/01/31 09:04 編集

JTextAreaには色々な内容が各行に出力されていきますけど、取り出したいのはJTextArea上にユーザーが入力した行だけ(典型的には最後の行)なのですよね?
guest

回答2

0

拙作ですが、以前、こういうのを作ってみました。参考になるかもしれません。
メモ帳

投稿2018/01/31 10:07

編集2018/01/31 10:07
mike2mike4

総合スコア891

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

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

TA-KEY

2018/01/31 17:07

ありがとうございます。自分には難しいですが勉強させていただきます。
guest

0

ベストアンサー

コメントにちょっと書いたのですが・・・
もしJTextArea上で一般のターミナルソフトでの入力のように一行ずつ入力させようとすると結構面倒な処理を書かなければなりません。非常に大雑把に書いても以下のような少々面倒な実装が必要になります。
(なお以下は質問者さんの元々のプログラムとは独立しており、動作を確認するのに必要であろうJScrollPaneを追加している点を除きJTextArea上でENTERによる行入力を実現する機能のみに絞って書いています)

Java

1import javax.swing.*; 2import javax.swing.text.BadLocationException; 3import java.awt.*; 4import java.awt.event.KeyAdapter; 5import java.awt.event.KeyEvent; 6 7public class TextInputSample extends JFrame { 8 public static void main(String[] args) { 9 new TextInputSample().setVisible(true); 10 } 11 12 TextInputSample() { 13 super("sample"); 14 textArea = new JTextArea(10, 20); 15 textArea.addKeyListener(new KeyAdapter() { 16 @Override 17 public void keyTyped(KeyEvent ev) { 18 if (ev.getKeyChar() == '\n') { 19 onEnter(); 20 } 21 } 22 }); 23 JScrollPane scrollPane = new JScrollPane(textArea, 24 JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 25 JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 26 add(scrollPane, BorderLayout.CENTER); 27 setDefaultCloseOperation(EXIT_ON_CLOSE); 28 pack(); 29 } 30 31 JTextArea textArea; 32 33 void printf(String format, Object... args) { 34 String text = String.format(format, args); 35 textArea.append(text); 36 } 37 38 void onEnter() { 39 int pos = textArea.getCaretPosition(); 40 assert pos > 0; // ENTER入力後には必ず1以上になるはず 41 try { 42 int lineNumber = textArea.getLineOfOffset(pos - 1); 43 int startPos = textArea.getLineStartOffset(lineNumber); 44 String text = textArea.getText(startPos, pos - 1 - startPos); 45 printf("user input: '%s'%n", text); 46 } catch (BadLocationException e) { 47 e.printStackTrace(); 48 } 49 } 50}

「大雑把」と書きましたがそれは一般のターミナルソフトと違って、カーソルを上の行へ移動してENTERを押すとその行全体の内容を「あたかもユーザーがタイプしたかのように」勘違いしてしまう点です。大抵のターミナルソフトではカーソルを上へ移動できても「既に出力された行を編集できない」ようになっていてそこでENTERを押すと最終行にその行をコピーした状態になるといった特殊な動作をします。JTextAreaっていうのは要するに単なるテキストエディターであってターミナルソフトのような行入力指向の機能にはなっていないのでこうした面倒なことを設計しなくてはならないのです。

一応コードは貼りましたが「こうすればよい」というつもりはなく、「こんな面倒な実装をわざわざJTextAreaでやるべきではない」というのが自分の意見です。

行単位での入力をさせたいならもっとシンプルな方針を立てた方がよいと思います。例えばJTextFieldを用いて入力させた方がプログラムはずっと単純ですしユーザーだってどう操作すればよいかわかりやすいのではないでしょうか?JTextAreaを用いるとしてもそれは出力専用とすることをお奨めしたいです。

投稿2018/01/31 09:41

編集2018/01/31 17:09
KSwordOfHaste

総合スコア18392

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

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

TA-KEY

2018/01/31 17:11

初心者の私にも分かりやすい説明でとても納得できました。わざわざコードもかいていただき、ありがとうございます。やっとコードも理解できました。 おっしゃる通り、TextAreaに入力してもらうというのがナンセンスだと思いましたので、方法を変えてみようと思います。ありがとうございました。
KSwordOfHaste

2018/01/31 17:47 編集

うーん、ナンセンスではないと思います。多少サボった実装でもどう使えばよいかわかっている自分専用のアプリならまぁまぁ使える場合もあるでしょう。 自分で使うにしても実装がちょっとめんどくさいのがネックではありますね。 いずれにせよ他の人に使ってもらうなら分かり易い操作にしないとかえって使いづらくなりがちなのでそれが単純な機能・実装をお奨めする理由です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問