- PR -

SwingのGUI作成について

1
投稿者投稿内容
hiro
会議室デビュー日: 2003/09/03
投稿数: 1
投稿日時: 2003-09-03 17:10
Swingを使ってウインドウを表示したいのですが、どうもうまくいきません。
現象としては一番最後にインスタンスを作ったアイテム(この場合はテキストフィールド)
が setBounds を無視してフレーム内で全体化されてしまいます。
コーディングが根本的に間違っているのでしょうか??
どうかお知恵をお貸しください。

コード:
class TestFrame extends JFrame implements ActionListener{
    JTextField text1;
    JButton btn1,btn2;
	
    TestFrame(String title){
        super(title);
		
        btn1 = new JButton("ボタン1");
        btn1.setBounds(50,100,300,60);
        getContentPane().add(btn1);
        btn1.setVisible(true);

        btn2 = new JButton("ボタン2");
        btn2.setBounds(50,200,300,60);
        getContentPane().add(btn2);
        btn2.setVisible(true);

        text1 = new JTextField ();
        text1.setBounds(50,300,300,60);
        getContentPane().add(text1);
        text1.setVisible(true);
    }

    public void paint(Graphics g){
    }
}

public class TestWindow {
    public static void main(String[] args) {

        TestFrame frm = new TestFrame("フレームテスト");
        frm.setSize(300,200);
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.setVisible(true);
    }
}


かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-09-03 17:37
Content PaneのデフォルトのLayout ManagerはBorderLayoutであり、
Container.add()メソッドにおいて、constraints(位置の基準みたいなもの)を指定しなかった場合、BorderLayout.CENTERが指定されます。

今回の場合、すべてセンターに配置され、結果、最後に追加したTextFieldのみが見えたのでしょう。

Layout Managerを指定しないという方法もありますが、やめたほうが良いでしょう(いちいち、指定するのが私には面倒なだけ。他にもなにか弊害があったような)。

直接位置を指定したければ、SpringLayoutを使用することになると思いますが、非常に使い勝手が悪いので、覚悟しておいてください。

また、直接位置を指定できるわけではありませんが、ある程度、自身で位置の指定が出来るGridBagLayoutというのもあります。これも使い勝手が良いものとは言えません(なれちまえば別かな)。

お好きな方法をどうぞ。


[ メッセージ編集済み 編集者: かずくん 編集日時 2003-09-03 17:43 ]

[ メッセージ編集済み 編集者: かずくん 編集日時 2003-09-03 17:45 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-09-03 17:41
そうそう、 Layoutの構築を開始させるために、setVisible(true)の前に、pack()メソッドを呼びます。

# setVisible()でもariseされるんだっけ?
ゆう
ベテラン
会議室デビュー日: 2003/06/20
投稿数: 56
投稿日時: 2003-09-03 17:59
こんにちわ。お世話になっております。

引用:

現象としては一番最後にインスタンスを作ったアイテム(この場合はテキストフィールド)
が setBounds を無視してフレーム内で全体化されてしまいます。



わたしの環境(WindowsXP-Pro,JDK1.4)では、それらしく配置はされているように見えました。ウィンドウのサイズを大きくすると、ボタンも二つ見えました。テキストフィールドだけはsetBoundで指定したようには配置されていませんでしたが……。
#これはBorderLayoutのCENTER内で配置されてるのかな…

3つのオブジェクトを縦に並べたいのだと思いますが、かずくんさんのおっしゃるとおりにLayoutManagerを指定するのがよいのではと思います。簡単に並べたいのならば、GridLayoutで実現できるのはないでしょうか??

コード:
import java.awt.*;
import javax.swing.*;

class TestFrame extends JFrame{
	JTextField text1;
	JButton btn1,btn2;
	
	TestFrame(String title){
		super(title);
		Container cp = getContentPane();
		cp.setLayout(new GridLayout(3,1));
		
		btn1 = new JButton("ボタン1");
		cp.add(btn1);

		btn2 = new JButton("ボタン2");
		cp.add(btn2);

		text1 = new JTextField ();
		cp.add(text1);
		
		setSize(300,200);
		setVisible(true);

	}


	public static void main(String[] args) {
		TestFrame frm = new TestFrame("フレームテスト");
	}
}

1

スキルアップ/キャリアアップ(JOB@IT)