• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:javaのフレームにサイズがセットされてない?)

Javaのフレームにサイズがセットされてない?

このQ&Aのポイント
  • 前回の質問に対する回答をもとにframe.setvisible(true)をコンストラクタの最後にするとうまくいくが、mainメソッドに書くとフレームのタイトル部分だけとなり、サイズがセットされないまま実行される。なぜ?
  • Javaのフレームにサイズがセットされない問題は、コンストラクタとmainメソッドの違いに起因している可能性がある。
  • 特に、frame.setvisible(true)をコンストラクタの最後に書いた場合、初期化が完了してから表示されるため、正しくサイズがセットされて表示される。一方、mainメソッドに書いた場合、フレームのタイトル部分だけが表示され、サイズがセットされないまま実行される可能性がある。

質問者が選んだベストアンサー

  • ベストアンサー
  • tekebon
  • ベストアンサー率62% (36/58)
回答No.1

改造がんばってますね(^^ ご質問のプログラムでは、mein()で生成したフレームとは別のフレームを生成して そちらにGUIを配置しているため、本来のフレームが初期化されずにいます。 今回はFrame0自体がJFrameを継承して作っているので自分自身がフレームになります。 ですので、Frame0のコンストラクタの中では自分(this)に対して初期化をします。 なのでコンストラクタの中で新しくJFrameをnewする必要はありません。 setBounds()やsetDefaultCloseOperation()は自分自身に行います。 例) this.setBounds(30, 30, 300, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ※「this.」は省略可能です。 よって、コンポーネントも自分に追加することになります。 Container c=this.getContentPane(); c.add(panel,BorderLayout.CENTER); さらに蛇足ですが、JaveSE5あたりからgetContentPane()しなくても フレームに直接add()メソッドで配置できるようになっています。 ですのでthis.add(panel,BorderLayout.CENTER);でも追加が可能です。 (本来はContentPaneという部分を扱っているというのは重要な知識なんですけどね)

nurseboy
質問者

お礼

何度も詳しくありがとうございます。 やっと形にすることができました。

その他の回答 (2)

  • javakids
  • ベストアンサー率0% (0/1)
回答No.3

追伸 public class Table0{ public static void main(String[]args){ Frame0 f=new Frame0(); f.frame.setVisible(true); } } を実行すると setBounds()は反映されません public class Table0{ public static void main(String[]args){ Frame0 f=new Frame0(); f.frame.setBounds(30,30,300,200); f.frame.setVisible(true); } } ってすると一応できます。 あと Container c=frame.getContentPane(); c.add(panel,BorderLayout.CENTER); を frame.getContentPane().add(panel,BorderLayout.CENTER); に短縮できます

  • javakids
  • ベストアンサー率0% (0/1)
回答No.2

よくわかりませんが これでできますよ。 import java.awt.*; import javax.swing.*; import javax.swing.table.DefaultTableModel; public class Table0{ public static void main(String[]args){ Frame0 f=new Frame0(); f.frame.setVisible(true); } } class Frame0 extends JFrame{ JFrame frame; JPanel panel; JScrollPane jsp; JTable table; DefaultTableModel dtm; public Frame0(){ frame=new JFrame("table"); setBounds(30,30,300,200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); table=new JTable(8,5); jsp=new JScrollPane(table); setPreferredSize(new Dimension(250,70)); panel=new JPanel(); panel.add(jsp); Container c=frame.getContentPane(); c.add(panel,BorderLayout.CENTER); } } 単にオブジェクトを生成した変数を参照すればいいだけだと、おもいます いかがですか?