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

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

ただいまの
回答率

90.33%

  • Java

    14464questions

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

  • Eclipse

    1751questions

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

  • Swing

    232questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 234

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

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

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

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

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

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


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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/10 05: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の意思を感じてしまいますねー。

    キャンセル

  • 2018/05/10 12:35

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

    キャンセル

  • 2018/05/10 17:58

    素敵なご回答ありがとうございました!
    JTextAreaをsetPreferredSizeでサイズを指定し、Pack();で処理をしたところ
    無事に解決できました!
    レイアウトに関して間違った理解をしていた為、非常に参考になりました!

    続けざまに質問申し訳ないのですが、Swing/JavaFXを今から学ぶなら
    Python/C++に移る方が賢明なのでしょうか?

    キャンセル

  • 2018/05/10 18:36

    自分がコメントできる範囲をこえちゃうのですが・・・選択肢は色々あると思います。

    JavaFXでも近代的なGUIの概念が学べます。PythonのGUIは詳しくないですが、多分かまわないでしょう。C++とかになると言語に「標準GUI」といったものがないので様々なGUIライブラリーからよさげなものを選ぶことになるだろうと思います。OpenGLあたりになるのでしょうか・・・。C#でもFromとWPFあるいはもっと別の選択肢があります。またスタンドアロンではなくWebアプリということになればJavascript一択です。Javascriptは一番着目されている言語という話もありスタンドアロンアプリも作れるのでGUI含めて「覚えておいてまず損はない言語」と言えると思います。Macのプログラマしか作りたくないならSwiftとかがよいかも知れませんし、その他もろもろあります・・・

    「この言語でないと学べない」というものはないです。何をやるにしても「そこからプログラミングに大切な概念を学び取れる」ので学び方次第。逆に「この言語はできるけど他はできない」という状態になったらひょっとするとその人はプログラミングの本質がわかってないのかも知れません。
    UnityをやるとAndroidができないとか、JavaFXはできてもAndroidはできないみたいになる心配はそうまでしなくていいと思います。必要に応じて知ればいいのではないでしょうか。一つちゃんと知ることができれば他のものを恐れる必要はなくなると自分は思います(個人の感想です)

    キャンセル

  • 2018/05/11 20:46

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

    キャンセル

同じタグがついた質問を見る

  • Java

    14464questions

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

  • Eclipse

    1751questions

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

  • Swing

    232questions

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