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

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

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

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

Swing

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

Q&A

解決済

3回答

354閲覧

なぜか関数内で無限ループしてしまう

yukkuri

総合スコア624

Java

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

Swing

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

0グッド

0クリップ

投稿2018/09/19 13:04

編集2018/09/19 13:57

javaのソースで、引数の違うはずの関数が呼ばれています。
ソースは、

java

1package org.yukkuri.jyl.base.swing; 2 3import java.awt.*; 4 5import javax.swing.JFrame; 6 7import org.yukkuri.jyl.base.ComSize; 8 9public class JylFrame extends JFrame 10{ 11 private String title = "frame"; 12 private int x, y, width, height; 13 14 private Color backgroundColor; 15 private GraphicsConfiguration gc; 16 17 public JylFrame() 18 { 19 super(); 20 initFrame(); 21 } 22 23 public JylFrame( boolean fullscreen ) 24 { 25 setFullScreen( fullscreen ); 26 new JFrame( gc ); 27 } 28 29 public void setBackground( int argb ) 30 { 31 backgroundColor = new Color( argb , true); 32 getContentPane().setBackground( backgroundColor ); 33 } 34 35 public void setBounds( ComSize f ) 36 { 37 this.x = f.x; this.y = f.y; this.width = f.width; this.height = f.height; 38 39 setSize( new ComSize( width, height ) ); 40 setLocation( new ComSize( x, y ) ); 41 } 42 43 public void setLocation( ComSize f ) 44 { 45 this.x =f.x; this.y = f.y; 46 getContentPane().setLocation( x, y ); 47 } 48 49 public void setSize( ComSize f ) 50 { 51 getContentPane().setPreferredSize( new Dimension( f.width, f.height ) ); 52 pack(); 53 setBackground( backgroundColor ); 54 } 55 56 private void initFrame() 57 { 58 setTitle( title ); 59 setResizable( false ); 60 setDefaultCloseOperation( 3 ); 61 setBackground( 0xff000000 ); 62 } 63 64 private void setFullScreen( boolean fullscreen ) 65 { 66 GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 67 GraphicsDevice gd = ge.getDefaultScreenDevice(); 68 gc = gd.getDefaultConfiguration(); 69 if( fullscreen ){ 70 gd.setFullScreenWindow( this ); 71 }else{ 72 gd.setFullScreenWindow( null ); 73 } 74 } 75} 76

ComSize.java

java

1package org.yukkuri.jyl.base; 2 3public class ComSize 4{ 5 6 public int x; 7 8 public int y; 9 10 public int width; 11 12 public int height; 13 14 public ComSize() 15 { 16 x = y = width = height = 0; 17 } 18 19 public ComSize( int x, int y ) 20 { 21 this.x = x; this.y = y; 22 this.width = this.height = 0; 23 } 24 25 public ComSize( int xy, int width, int height ) 26 { 27 this.x = xy; this.y = xy; 28 this.width = width; this.height = height; 29 } 30 31 public ComSize( int x, int y, int width, int height ) 32 { 33 this.x = x; this.y = y; 34 this.width = width; this.height = height; 35 } 36} 37

この中のsetSize( ComSize )を呼び出すと、

at org.yukkuri.jyl.base.swing.JylFrame.setBounds at java.awt.Window.setClientSize( Window.java:958 ) at java.awt.Window.pack( Window.java:811 ) at org.yukkuri.jyl.base.swing.JylFrame.setSize

とループしています。

調べたこと、やってみたこと
setBounds()の関数名を変更してみた > エラーは一緒
引数確認 > 引数の数、型が違うことが確認

ちなみにEclipse, java7 で、エラーは一瞬しか表示されませんでした。実行はされます。

追加 呼び出しクラス

java

1final class SwingTest 2{ 3 public static void main( String[] args ) throws InterruptedException 4 { 5 JylFrame jf = new JylFrame(); 6 jf.setSize( new ComSize( 640, 480 ) ); 7 jf.add( new SwingTestPanel() ); 8 jf.setVisible( true ); 9 Thread.sleep( 10000 ); 10 System.exit( 0 ); 11 } 12}

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

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

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

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

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

umyu

2018/09/19 13:36

クラス ComSizeの定義を質問文に追記してくださいな。
umyu

2018/09/19 13:55 編集

追記ありがとうございます。質問文のコードを元に最小限のコードとプロジェクトで確認してみましたが。無限ループが発生しなかったので、呼び出し側の処理が原因ではないでしょうか。 JylFrame frame = new JylFrame();frame.setSize(new ComSize(20,20));frame.setVisible(true);
yukkuri

2018/09/19 13:56

一回呼び出しているところのソースを貼ります。
umyu

2018/09/19 14:02

SwingTestPanelがないですー。
yukkuri

2018/09/19 14:08

まあJPanelで代用できるのでそれでお願いします…すいません。
umyu

2018/09/19 14:10

こちらでは、再現しませんが明らかにコード上おかしい点だけ指摘しておきます。
umyu

2018/09/19 14:14

1,jf.setSize( new ComSize( 640, 480 ) ); ←x,yしか値を設定していないので、width とheightがそれぞれ0です。自作せずにPointクラスやSizeクラス、Dimenstionを使うようにしてくださいな。 2, new JFrame( gc );としてますが、戻り値を何も使っていないので何の効果もないです。super(gc);を呼び出して、setFullScreen(fullscreen );とするのが正しいのでは?
umyu

2018/09/19 14:17 編集

3,一定時間後に閉じたい場合は、mainスレッドがブロックするThread.sleepではなく、swing.Timerを起動し、終了するような形にしてください。以上ですー。
yukkuri

2018/09/19 14:17

2について そしたらgcがnullになってできないのではと考えたんですが・・・
umyu

2018/09/19 14:35 編集

ああ、2はそーいう処理ですか。その場合はうーん、Swingなら以下の処理でフルスクリーンぽいのはできたよーな。this.setExtendedState(JFrame.MAXIMIZED_BOTH);this.setUndecorated(true); 話のポイントとしては、コンストラクタのオーバーロードを作る時は、this()呼び出しを使用してコンストラクタ内で同じ処理が行われるようにしないと、2で指摘したよーな問題が発生するかと。
yukkuri

2018/09/19 14:37

ありがとうございます!確かにフルスクリーンっぽいのはできました。ただ、質問内容とそれてきてますので…
guest

回答3

0

自己解決

なんでかわかりませんが自己解決しました。
コードをはっときます。

java

1 @Override public void setBounds( Rectangle r ) 2 { 3 this.x = r.x; this.y = r.y; this.width = r.width; this.height = r.height; 4 5 setLocation( new Point( x, y ) ); 6 setSize( new Dimension( width, height ) ); 7 } 8 9 @Override public void setLocation( Point p ) 10 { 11 this.x = p.x; this.y = p.y; 12 13 setLocation( x, y ); 14 } 15 16 @Override public void setSize( Dimension d ) 17 { 18 this.width = d.width; this.height = d.height; 19 20 getContentPane().setPreferredSize( d ); 21 pack(); 22 }

最後に、umyuさん、kanaria007さん、R.Mizukamiさん、ありがとうございました。

投稿2018/09/20 11:00

yukkuri

総合スコア624

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

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

0

こんにちは

setBounds()の関数名を変更したのにエラーが一緒ということは、別のsetBounds()が呼ばれたのだと思います
extends JFrameしているクラスなので、継承元のJFrame内に定義してあるsetBounds()が呼ばれたのではないでしょうか?

JavaDocのJFrameの定義を見ると以下のような感じですが、引数の数や型はどうでしょうか(Java8のですが)
https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Window.html

Java

1public void setBounds(int x, int y, int width, int height) 2public void setBounds(Rectangle r)

Swingは詳しくないのですが、軽くDocを見る限り、pack()を呼ぶと、適切なメソッドを勝手に呼び出してサイズをいい感じにしてくれるようですね
リンクのDocのページにはこれっぽっちも?setClientSize()について書いていないみたいですが、stackoverflowを見てみたら
https://stackoverflow.com/questions/34159898/why-calling-jframe-pack-after-jframe-setvisibletrue-affect-the-location-wher

pack() makes a call to setClientSize() that itself makes a call to setBounds(x,y,w,h)

とありますので、これが正しいのなら、↓が呼ばれたのだと思います

Java

1public void setBounds(int x, int y, int width, int height)

投稿2018/09/19 14:17

kanaria007

総合スコア67

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

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

yukkuri

2018/09/19 14:25

なんとなくイメージはしていましたが・・・ setClientSizeはjavaのソースを見てな感じです(雑ですねすいません) super.setBoundsにしない理由はフレーム全体のサイズなのが嫌で、 描画範囲を640x480みたいにしたかったからです。 長文すいません。
guest

0

setBounds で setSize を呼んでいるからではないでしょうか。

setSize -> setPreferredSize -> setBounds -> setSize -> ...

別の理由みたいですね、すみません。

投稿2018/09/19 13:08

編集2018/09/19 13:10
R.Mizukami

総合スコア1077

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

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

yukkuri

2018/09/19 13:10

エラーメッセージ等から、なぜsetPrefferedSizeが出てきたのかわからないのですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問