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

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

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

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

Q&A

解決済

2回答

408閲覧

javaのJTextAreaについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/11/05 00:54

プログラミング初心者ですが、javaでウィンドウにテキストエリアを表示するシステムを作ろうとしています
エラーは出ず、コンパイルすることができましたがテキストエリアが表示されません

ソースコード

java

1import javax.swing.*; 2import java.awt.*; 3 4public class Project extends JFrame { 5 public static void main(String args[]) { 6 JFrame frame = new JFrame("Window"); 7 frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 8 frame.setSize (800,500); 9 frame.setLocationRelativeTo (null); 10 frame.setVisible(true); 11 } 12 Project (String title){ 13 JPanel p = new JPanel(); 14 JTextArea area =new JTextArea("text",300,200); 15 p.add (area); 16 Container contentPane = getContentPane(); 17 contentPane.add(p,BorderLayout.CENTER); 18 } 19}

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず、空っぽのJFrameをnewして表示させているのがおかしいので
自分でレイアウトしたJFrameを使うように直しましょう。

Java

1// JFrame frame = new JFrame("Window"); 2JFrame frame = new Project("Window");

あと、テキストエリアですが表示はされているんだと思います。
サイズがでかすぎて分からなくなってしまっているだけではないかと。
適当なサイズに直して試してみましょう。

Java

1// JTextArea area =new JTextArea("text",300,200); 2JTextArea area = new JTextArea("text", 10, 70);

投稿2018/11/05 01:18

編集2018/11/05 01:19
root_jp

総合スコア4666

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

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

0

解決済みではありますが・・・

アプリを作るときのコツめいたことを少しコメントしてみます。

  • レイアウトマネージャーとレイアウト制約

元のコードではJTextAreaを置くJPanelにレイアウトマネージャーを指定してませんのでデフォルトのFlowLayoutが使われます。このためユーザーがウィンドウのリサイズ操作をしてもJTextAreaのサイズは固定のままとなり、ウィンドウのサイズに応じて広がったり縮まったりしてくれません。BorderLayoutを用いるとウィンドウのサイズに応じて子供が自動的にリサイズするようなふるまいを簡単にさせられます。またJFrameのcontentPaneはデフォルトでBorderLayoutを適用したJPanelになってますので、ご質問のコードにあるようなJPanelの生成は省略することもできます。
最初は「サイズや位置を固定で指定する」方法がわかりやすいのですが、それだと充分な使い勝手にならないことが多いのでレイアウトマネージャーやレイアウト制約について学ぶとよいと思います。swingに限らずGUIライブラリーを使う場合必ずと言ってよいほどレイアウト制約の考え方が出てきますので。

  • 自分自身の属性は自分自身のコンストラクターで設定する

mainメソッドでProjectのインスタンスを作ってそこにサイズや位置などいろいろ設定してますが、そのようにするといちいち
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
なんてふうに記述がながくなります。これをProjectのコンストラクターの方に書けば
setDefaultCloseOperation(EXIT_ON_CLOSE);
と書けます。レシーバー(frame)が自分自身(this)の場合thisが省略できますしProjectの継承元のフィールド(EXIT_ON_CLOSE)を参照するのにいちいちクラス名をくっつけなくてもよいからです。
これらは「単に記述が短くなるからよい」のではなく「初期化は自分自身のコンストラクターで行うのが自然」であり、その原則を守ることで自然に分かり易く短く記述できるのだと考えたほうがよいと思います。

  • 可視化

他のGUIライブラリーで通用する原則ではないのですが、「JFrameの初期化をコンストラクターでやる」には例外があり、最初の可視化(setVisible)だけはコンストラクターの外(mainメソッド)で行ったほうがよいです。詳細は省略しますが、最初の可視化によって動き出すEDT(Event Dispatch Thread)とmainスレッドでのGUI処理が並列に動作することによる様々な不具合を避けるためのお約束と思ってください。

こうしたことを考慮して少しコードを変えてみますと

Java

1import javax.swing.*; 2import java.awt.*; 3 4public class Project extends JFrame { 5 public static void main(String args[]) { 6 // mainメソッドではウィンドウ(JFrame)を作ってそれを可視化するコードしか書かない方がよい 7 JFrame frame = new Project("Window"); 8 frame.setVisible(true); 9 } 10 11 Project (String title){ 12 super(title); // 基底クラスの適切なコンストラクターを呼び出しましょう。 13 JTextArea area = new JTextArea("text", 10, 70); // root_jpさん回答の通り 14 add(area, BorderLayout.CENTER); 15 // 上記の1行は次の2行と同じ意味になる(小技) 16 //Container contentPane = getContentPane(); 17 //contentPane.add(p, BorderLayout.CENTER); 18 19 setDefaultCloseOperation(EXIT_ON_CLOSE); 20 //setSize (800,500); //サイズはレイアウトマネージャーにお任せで 21 pack(); //お約束。レイアウトマネージャーに全てのComponentのサイズや位置を初期計算させる 22 setLocationRelativeTo(null); //JFrameのサイズが決まったらこれができるようになる 23 } 24}

自分は常々「swingはまだ充分成熟していない時期のGUIライブラリー」のように感じていました。なんとなれば

「ああもできるしこうもできる」
=>「自分でレイアウトを計算することもできるし、レイアウトマネージャーに任せることもできる」
=>多くの初心者が柔軟でない方法(自分で全部レイアウトを計算する)でプログラムを書くくせがついてしまう

という流れになってしまっていた気がするのです。こういう癖は気づかないとずっとよくないコードを書く結果になります。swing後継のマイナー感あふれる(?)JavaFXですが新しい設計のためかswingのように「よくない方法でGUIを作れてしまう」ような余地が少なく「よい方法ででしか作れないような仕様」になっていると感じます。swingを学んでもよいと思いますが、もし状況が許すならJavaFXを学ぶのも無駄ではないと思います。

投稿2018/11/05 04:53

KSwordOfHaste

総合スコア18392

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問