dポイントプレゼントキャンペーン実施中!

前回、http://oshiete.goo.ne.jp/qa/8069621.htmlで質問しました。
回答をもとにframe.setvisible(true)をコンストラクタの最後にするとうまくいき回答を締め切ったんですが・・・。
しかし、mainメソッドにframe.setvisible(true)を書くとフレームのタイトル部分だけとなり、
サイズがセットされないまま実行したときと同じようになってしまいます。
なぜでしょう?よろしくお願いします。


import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Table0{
public static void main(String[] args) {
Frame0 test=new Frame0();
test.setVisible(true);
}

}

class Frame0 extends JFrame{
JFrame frame;
JPanel panel;
JScrollPane jsp;
JTable table;
DefaultTableModel dtm;

public Frame0(){
frame=new JFrame("table");
frame.setBounds(30, 30, 300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


table=new JTable(8,5);

jsp=new JScrollPane(table);
jsp.setPreferredSize(new Dimension(250, 70));

panel=new JPanel();
panel.add(jsp);

Container c=frame.getContentPane();
c.add(panel,BorderLayout.CENTER);



}
}

A 回答 (3件)

改造がんばってますね(^^



ご質問のプログラムでは、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という部分を扱っているというのは重要な知識なんですけどね)
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/05/08 20:33

追伸


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);
に短縮できます
    • good
    • 0

よくわかりませんが


これでできますよ。
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);

}


}

単にオブジェクトを生成した変数を参照すればいいだけだと、おもいます
いかがですか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!