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

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

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

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

Swing

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

259閲覧

SwingでJTextAreaがEclipse上と実行形式jarの起動とで、サイズが異なってしまう

Javastudent00

総合スコア7

Java

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

Swing

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

1クリップ

投稿2018/05/09 15:06

JavaのSwingを最近勉強し始めた者なのですが、
チュートリアルとしてChatBotのプログラムを作っていたところ
Eclipse上での実行と、実行形式のjarファイルからの実行で
JTextAreaのサイズが変わってしまうのです……

EclipseではJTextAreaの引数がしっかり反映されているんですが……

どなたか解決策をお恵み下さい。
ソースは以下の通りです。

public class MainSystem extends JFrame{ JPanel p=new JPanel(); JTextArea txtlog=new JTextArea(18,50); JTextField txtinput=new JTextField(50); JScrollPane scroll=new JScrollPane( txtlog, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ); Desktop d = Desktop.getDesktop(); public MainSystem(){ super("TalkAI_α0.1.0"); setBounds(100,100,640,480); setResizable(false); setDefaultCloseOperation(EXIT_ON_CLOSE); txtlog.setEditable(false); p.add(scroll); p.add(txtinput); add(p); setVisible(true); txtinput.addActionListener(new ActionListener(){ //ここは会話プログラムなので省略 } public void AISay (String s) { txtlog.append("AI:" + s + "\n"); } public static void main(String[] args){ new MainSystem(); } }

試したこと

JPanelを.setSizeや.setBoundsに変えた。
jreをEclipseの実行環境に合わせてjarファイルを起動した。

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

jre1.8.0_101
Eclipse version4.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

提示しておられるソースで試してみましたが再現しませんでした。
(Windows 10, jre1.8.0_172)

原因はわからないのですが気になる点があるのでコメントしてみます。
(原因にからみそうかはスミマセンがわかりません)

  • 自分で直接setSizeなどはしない方がよい

直接指定しない代わりにsetMinumumSize, setPreferredSize, setMaximumSizeを用いて「大きさの制約をswingに宣言し、実際のレイアウト処理はswingに任せる」のが基本だと思います。実際予期せぬタイミングでSwingが自動的にレイアウトフェーズを開始してしまったりするので、そのようなタイミングを意識できないままsetSizeとしてしまうとswingがその指示を上書きしてしまい期待通りのレイアウトにならないなんてトラブルがよく起きます。

  • packの呼び忘れ

JFrameの初期化が終わったら最後にpack()を呼ぶのがお約束です。これは「さぁ全部のコンポーネント階層と制約は設定したからレイアウトやってね」とswingへ指示することを意味します。

  • setVisibleのタイミング

より慎重なswingの初期化の仕方はEDT(Event Dispatch Thread)上で全ての初期化を行うことなのですが、メンドクサイのでmainスレッド上でやってしまうことも多いです。しかしながらmainスレッドでやるなら気を付けることがあり、Componentの実体(peer)が生成されEDTスレッドが動き始めるようなことを初期化途中ですべきでないです。setVisible(true)とやるとそういうことが起きます。それゆえsetVisibleは初期化途中で行わず

java

1public static void main(String[] args) { 2 new MainSystem().setVisible(true); 3}

のようにするのが(自分は)間違いがおきないよい習慣だと思っていました。


ところで・・・ご存知かも知れませんが、今現在Javaの標準GUIはswing/awtからJavaFXに変わってます。JavaFXは当然ならがswingより現代的な(より洗練された)機能になってるので今から学ぶならswingよりはよいと思います。

投稿2018/05/09 19:53

KSwordOfHaste

総合スコア18394

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

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

umyu

2018/05/09 20:54

>KSwordOfHasteさんへ Swing/JavaFXは迷走している感じになってます。 https://blogs.oracle.com/java-platform-group/the-future-of-javafx-and-other-java-client-roadmap-updates http://www.oracle.com/technetwork/java/javase/javaclientroadmapupdate2018mar-4414431.pdf 纏めるとJavaFX→OpenJFX化 、Oracleはサポート期間(JavaFXは2022年、Swingは2026年) 個人的な感想ですが、もうデスクトップGUIはサポートコストが高くて関わりたくないというOracleの意思を感じてしまいますねー。
KSwordOfHaste

2018/05/10 03:35

コメントありがとうござます。 ・汎用PC用のクライアントサイドのGUIを学ぶならそもそもJavaはベストではないだろう ・さりとて何がよいかはそれはそれでまた別の話 ということで自分がコメントできる範囲をこえちゃいそうなので「swingよりは」とお茶を濁してしまいましたw;
Javastudent00

2018/05/10 08:58

素敵なご回答ありがとうございました! JTextAreaをsetPreferredSizeでサイズを指定し、Pack();で処理をしたところ 無事に解決できました! レイアウトに関して間違った理解をしていた為、非常に参考になりました! 続けざまに質問申し訳ないのですが、Swing/JavaFXを今から学ぶなら Python/C++に移る方が賢明なのでしょうか?
KSwordOfHaste

2018/05/10 09:36

自分がコメントできる範囲をこえちゃうのですが・・・選択肢は色々あると思います。 JavaFXでも近代的なGUIの概念が学べます。PythonのGUIは詳しくないですが、多分かまわないでしょう。C++とかになると言語に「標準GUI」といったものがないので様々なGUIライブラリーからよさげなものを選ぶことになるだろうと思います。OpenGLあたりになるのでしょうか・・・。C#でもFromとWPFあるいはもっと別の選択肢があります。またスタンドアロンではなくWebアプリということになればJavascript一択です。Javascriptは一番着目されている言語という話もありスタンドアロンアプリも作れるのでGUI含めて「覚えておいてまず損はない言語」と言えると思います。Macのプログラマしか作りたくないならSwiftとかがよいかも知れませんし、その他もろもろあります・・・ 「この言語でないと学べない」というものはないです。何をやるにしても「そこからプログラミングに大切な概念を学び取れる」ので学び方次第。逆に「この言語はできるけど他はできない」という状態になったらひょっとするとその人はプログラミングの本質がわかってないのかも知れません。 UnityをやるとAndroidができないとか、JavaFXはできてもAndroidはできないみたいになる心配はそうまでしなくていいと思います。必要に応じて知ればいいのではないでしょうか。一つちゃんと知ることができれば他のものを恐れる必要はなくなると自分は思います(個人の感想です)
Javastudent00

2018/05/11 11:46

回答有難う御座います!非常に参考になりました! 改めて考えたのですが、まだまだ初心者なので今はSwingを使いこなして 必要になったら別の言語に移ろうかなぁと思います。 でもC++は極めたかったり('ω')
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問