javaのソースで、引数の違うはずの関数が呼ばれています。
ソースは、
package org.yukkuri.jyl.base.swing;
import java.awt.*;
import javax.swing.JFrame;
import org.yukkuri.jyl.base.ComSize;
public class JylFrame extends JFrame
{
private String title = "frame";
private int x, y, width, height;
private Color backgroundColor;
private GraphicsConfiguration gc;
public JylFrame()
{
super();
initFrame();
}
public JylFrame( boolean fullscreen )
{
setFullScreen( fullscreen );
new JFrame( gc );
}
public void setBackground( int argb )
{
backgroundColor = new Color( argb , true);
getContentPane().setBackground( backgroundColor );
}
public void setBounds( ComSize f )
{
this.x = f.x; this.y = f.y; this.width = f.width; this.height = f.height;
setSize( new ComSize( width, height ) );
setLocation( new ComSize( x, y ) );
}
public void setLocation( ComSize f )
{
this.x =f.x; this.y = f.y;
getContentPane().setLocation( x, y );
}
public void setSize( ComSize f )
{
getContentPane().setPreferredSize( new Dimension( f.width, f.height ) );
pack();
setBackground( backgroundColor );
}
private void initFrame()
{
setTitle( title );
setResizable( false );
setDefaultCloseOperation( 3 );
setBackground( 0xff000000 );
}
private void setFullScreen( boolean fullscreen )
{
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
gc = gd.getDefaultConfiguration();
if( fullscreen ){
gd.setFullScreenWindow( this );
}else{
gd.setFullScreenWindow( null );
}
}
}
ComSize.java
package org.yukkuri.jyl.base;
public class ComSize
{
public int x;
public int y;
public int width;
public int height;
public ComSize()
{
x = y = width = height = 0;
}
public ComSize( int x, int y )
{
this.x = x; this.y = y;
this.width = this.height = 0;
}
public ComSize( int xy, int width, int height )
{
this.x = xy; this.y = xy;
this.width = width; this.height = height;
}
public ComSize( int x, int y, int width, int height )
{
this.x = x; this.y = y;
this.width = width; this.height = height;
}
}
この中の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 で、エラーは一瞬しか表示されませんでした。実行はされます。
追加 呼び出しクラス
final class SwingTest
{
public static void main( String[] args ) throws InterruptedException
{
JylFrame jf = new JylFrame();
jf.setSize( new ComSize( 640, 480 ) );
jf.add( new SwingTestPanel() );
jf.setVisible( true );
Thread.sleep( 10000 );
System.exit( 0 );
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
なんでかわかりませんが自己解決しました。
コードをはっときます。
@Override public void setBounds( Rectangle r )
{
this.x = r.x; this.y = r.y; this.width = r.width; this.height = r.height;
setLocation( new Point( x, y ) );
setSize( new Dimension( width, height ) );
}
@Override public void setLocation( Point p )
{
this.x = p.x; this.y = p.y;
setLocation( x, y );
}
@Override public void setSize( Dimension d )
{
this.width = d.width; this.height = d.height;
getContentPane().setPreferredSize( d );
pack();
}
最後に、umyuさん、kanaria007さん、R.Mizukamiさん、ありがとうございました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
setBounds で setSize を呼んでいるからではないでしょうか。
setSize -> setPreferredSize -> setBounds -> setSize -> ...
別の理由みたいですね、すみません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
こんにちは
setBounds()の関数名を変更したのにエラーが一緒ということは、別のsetBounds()が呼ばれたのだと思います
extends JFrameしているクラスなので、継承元のJFrame内に定義してあるsetBounds()が呼ばれたのではないでしょうか?
JavaDocのJFrameの定義を見ると以下のような感じですが、引数の数や型はどうでしょうか(Java8のですが)
https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Window.html
public void setBounds(int x, int y, int width, int height)
public 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)
とありますので、これが正しいのなら、↓が呼ばれたのだと思います
public void setBounds(int x, int y, int width, int height)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
umyu
2018/09/19 22:36
クラス ComSizeの定義を質問文に追記してくださいな。
umyu
2018/09/19 22:54 編集
追記ありがとうございます。質問文のコードを元に最小限のコードとプロジェクトで確認してみましたが。無限ループが発生しなかったので、呼び出し側の処理が原因ではないでしょうか。
JylFrame frame = new JylFrame();frame.setSize(new ComSize(20,20));frame.setVisible(true);
yukkuri
2018/09/19 22:56
一回呼び出しているところのソースを貼ります。
umyu
2018/09/19 23:02
SwingTestPanelがないですー。
yukkuri
2018/09/19 23:08
まあJPanelで代用できるのでそれでお願いします…すいません。
umyu
2018/09/19 23:10
こちらでは、再現しませんが明らかにコード上おかしい点だけ指摘しておきます。
yukkuri
2018/09/19 23:12
はい
umyu
2018/09/19 23: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 23:16 編集
3,一定時間後に閉じたい場合は、mainスレッドがブロックするThread.sleepではなく、swing.Timerを起動し、終了するような形にしてください。以上ですー。
yukkuri
2018/09/19 23:17
2について そしたらgcがnullになってできないのではと考えたんですが・・・
umyu
2018/09/19 23:34 編集
ああ、2はそーいう処理ですか。その場合はうーん、Swingなら以下の処理でフルスクリーンぽいのはできたよーな。this.setExtendedState(JFrame.MAXIMIZED_BOTH);this.setUndecorated(true);
話のポイントとしては、コンストラクタのオーバーロードを作る時は、this()呼び出しを使用してコンストラクタ内で同じ処理が行われるようにしないと、2で指摘したよーな問題が発生するかと。
yukkuri
2018/09/19 23:37
ありがとうございます!確かにフルスクリーンっぽいのはできました。ただ、質問内容とそれてきてますので…