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

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

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

JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

Java

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

Swing

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

Eclipse

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

Q&A

解決済

1回答

6200閲覧

JFrameの高さがずれてしまう

varlal

総合スコア42

JFrame

JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

Java

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

Swing

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

Eclipse

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

1グッド

1クリップ

投稿2015/02/11 11:24

Swingでのレイアウトが縦方向(高さ成分だけ)が稀にずれてしまう現象の修正が頑張ってもできないので質問させていただきます。修正方法が有りましたらご教授して頂けると嬉しいです。

実行環境

OS:ubuntu 14.04LTS 32bit
Eclipse Version: 3.8.1
javaSE-1.7(java-7-openjdk-i386)

問題のコード

lang

1import javax.swing.JButton; 2import javax.swing.JFrame; 3 4public class Test extends JFrame{ 5 JButton b; 6 public Test() { 7 //JFrame 8 setTitle("Test"); 9 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 10 setBounds(0, 0, 100, 30); 11 setResizable(false); 12 13 //JButton 14 b = new JButton(); 15 b.setText("hello!"); 16 b.setVisible(true); 17 b.setSize(100, 30); 18 19 add(b); 20 setVisible(true); 21 } 22}

いくつかの実行結果

setResizable(false)しているにもかかわらず、下図一番右のような高さが異なるJFrameがたまに出現してしまいます。感覚としては5〜10回に1回くらいJFrameサイズがずれます。
![イメージ説明]WIDTH:566

試みたこと

● ネットで同様の現象を調べた結果、環境が異なりますが同様の現象だと思い(Java レイアウトずれ@Windows)にあるように

1)Frame サイズ指定
2)メニューバー&メニューを登録
3)パネルにボタンを登録
4)Frame にパネルを登録(Layoutには NULL を指定)
5)表示(setVisible(true))

の順番でコーディング ⇒ 変化なし

● setLayout(new BorderLayout());を追加してきちんとレイアウト指定 ⇒ 変化なし

● Jframeを表示した際に、Jframeの移動やリサイズが自動で起こることを確認したので、何度もサイズを指定し直す。 ⇒体感、ズレる回数は少し減ったが、ズレることがある。

lang

1//addComponentListener(new compListen());を追加済み 2 3 private void updateSize(ComponentEvent e) { 4 System.out.println("e=" + e.toString()); 5 setSize(100, 30); 6 b.setSize(100, 30); 7 getContentPane().setPreferredSize(new Dimension(100, 30)); 8 getContentPane().setSize(new Dimension(100, 30)); 9 } 10 11 class compListen implements ComponentListener{ 12 @Override 13 public void componentHidden(ComponentEvent e) { 14 // TODO Auto-generated method stub 15 updateSize(e); 16 } 17 18 @Override 19 public void componentMoved(ComponentEvent e) { 20 // TODO Auto-generated method stub 21 updateSize(e); 22 } 23 24 @Override 25 public void componentResized(ComponentEvent e) { 26 // TODO Auto-generated method stub 27 updateSize(e); 28 } 29 30 @Override 31 public void componentShown(ComponentEvent e) { 32 // TODO Auto-generated method stub 33 updateSize(e); 34 } 35 }

疑問点

プログラム中では、ボタン・フレームのサイズを共にwidth:100,height:30としているが、ウィンドウのサイズはどうなっている?下図参照(これがフレームサイズだと思ってたんだけれど・・)
![イメージ説明]WIDTH:566

JavaDrive:フレームのサイズと表示位置によると、むしろ高さが狭くなっている方が通常?などと考えたり・・・
以下、JavaDrive様より引用

![イメージ説明]WIDTH:600

ここまで引用

長くなってしまいましたが、よろしくお願いいたします。

akkodesu👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

おそらくnew Test()している処理がmainメソッドにあると思いますが、そこも記載していただけますでしょうか。


AWTSwingなどのGUIを使用する場合は、描画処理をイベントディスパッチスレッド(AWTスレッド)で実行されるようにしないと、描画が正しく行われない可能性があります。
イベントディスパッチスレッドで実行するには、Swingの場合はSwingUtilities.invokeLater(Runnable)を使います。

例:

lang

1 // import javax.swing.SwingUtilities; 2 3 public static void main(String[] args) { 4 SwingUtilities.invokeLater(new Runnable() { 5 @Override 6 public void run() { 7 Test my = new Test(); 8 } 9 }); 10 }

(追記)

Windows 7では発生しないので、LinuxもしくはUbuntu固有の問題なのかもしれませんね。
ちなみにWindows 7では、100x30(width:100,height:30)にした場合、ウィンドウのサイズは142x48になっています。

直接原因は分かりませんが、いくつか修正したほうが良いと思う箇所はあります。
良かったら参考にしてみてください。
・ウィンドウサイズは(やはり)setSizeを使う
BorderLayoutではコンポーネントのサイズは指定できない
BorderLayoutに追加するときは、add(component, BorderLayout.CENTER)などを使う
validateを使ってみる

lang

1import java.awt.BorderLayout; 2import javax.swing.JButton; 3import javax.swing.JFrame; 4 5public class Test extends JFrame { 6 JButton b; 7 public Test() { 8 //JFrame 9 setTitle("Test"); 10 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 11// setBounds(0, 0, 100, 30); 12 setSize(100, 30); 13 setResizable(false); 14 15 //JButton 16 b = new JButton(); 17 b.setText("hello!"); 18// b.setVisible(true); 19// b.setSize(100, 30); 20 21// add(b); 22 add(b, BorderLayout.CENTER); 23 validate(); 24 setVisible(true); 25 } 26 27 public static void main(String[] args) { 28 SwingUtilities.invokeLater(new Runnable() { 29 @Override 30 public void run() { 31 @SuppressWarnings("unused") 32 Test my = new Test(); 33 } 34 }); 35 } 36 37}

投稿2015/02/11 11:47

編集2015/02/11 13:03
argius

総合スコア9388

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

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

varlal

2015/02/11 11:52

回答ありがとうございます。 メインに関しては、同package内の別のclassから呼んでいます。 public class Start { public static void main(String[] args) { Test my = new Test(); } } よろしくお願いいたします。
varlal

2015/02/11 12:15

--- argiusさん素早い回答ありがとうございます。 試して見ましたが、同様の現象は発生いたします。 イベントディスパッチスレッド(AWTスレッド)に関しては調べて見ようと思います。 他に心当たりが有りましたらよろしくお願いいたします。
argius

2015/02/11 13:03

具体的な解決策は見つかりませんでしたが、参考情報を追記しました。
varlal

2015/02/11 13:40

argiusさん、色々情報を頂きありがとうございます。 さらに、windows7でも動作確認して頂き、固有の問題である指摘に同意したいと思います。 ubuntuのGUI環境周りも調べて見ようと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問