總網頁瀏覽量

2013年5月4日 星期六

Java UI2(swing)



swing是awt加強版。awt的元件都可被swing替代,swing改善awt耗費系統資源與介面醜陋的問題。

swing所有的元件都直接或間接繼承自java.awt.Container類別。

java並不是將物件放在JFrame這一層而是放在ContentPane這層
因此將物件放到視窗之前必須使用Container getContentPane();
method取得視窗容器


注意:
Container有設定Layout的話,Button,Lable等元件的大小、位置設置也會由layout管理。
也就是說layout除了版面配置也會對button,lable的設定做限制
BorderLayout裡面的元件不可以自己setSize設定大小


1.準備JFrame視窗設定大小與標題

import javax.swing.JFrame;

class GameWindow extends JFrame

GameWindow  windows = new GameWindow();
//如果宣告static GameWindow windows=new GameWindow();
//在建構子不可以用windows.setTitle()之類的method
//也許是在new時候還沒有配置記憶體給windows給他
//還沒初始化成功

//Œ–利用static宣告JFrame物件,不要在建構式裡面利用類別變數設定初值
//因為類別變數在執行時才會配置記憶體


windows.setTitle("JFrame視窗標題");
windows.setSize(550,500);
windows.setDefaultCloseOperation(JFrame.EXIST_ON_CLOSE);
windows.setVisible(true);


swing的JFrame視窗比awt複雜,swing視窗包含多個層級,Top level container,root pane , layered pane ,glass pane,每個層級都有特定的功用。
其中以content pane最常用,因為swing的物件幾乎放在content pane這層級。
一開始new 出的JFrame屬於Top level container層級
JFrame繼承自awt的Frame類別因此JFrame可以用Frame的method。

JFrame執行後如果按下關閉視窗X按鈕,JFrame仍會停留在記憶體
因此務必要加上

windows.setDefaultCloseOperation(JFrame.EXIST_ON_CLOSE);
告訴JFrame視窗關閉時候記憶體也要關閉JFrame
否則預設Hide_ON_Close,只是隱藏視窗而已




2.取得ContentPane並設定Layout

import java.awt.Container;
Coantainer cp=windows.getContentPane();//取得視窗容器
cp.setLayout(new FlowLayout());
cp.setBackground(Color.pink);

ContentPane物件相當於awt的Frame
設定Layout種類.setLayout(Layout物件);
設定背景顏色.setBackground(Color.pink);
皆在ContentPane


3.將物件放到ContentPane裡面

//Button game = new Button("打地鼠");
//會出現亂碼,即使workspace以及project property設定為UTF8
//run configuration→common→encoding設定UTF8也一樣
JButton game = new JButton("打地鼠");
//用JButton就OK了
cp.add(game);



4.
GridLayout附加元件順序是由左而右 由上而下





static Game windows = new Game();
static Container cp = windows.getContentPane();
static JButton game = new JButton("打地鼠");
static JLabel label= new JLabel("這是Label");
static JPanel jpanel = new JPanel();

Game(){
// windows.setTitle("Erase Number");
//windows.setSize(550,500 );
// windows.setVisible(true);


}

public static void main(String[] args) {

windows.setTitle("Erase Number");
windows.setSize(550,500);
// cp.setLayout(new GridLayout(4,4));
// cp.setLayout(new FlowLayout());
//如果要自己設定button大小,將layout設定Null
//因為設定layout就是讓layout管理該container
cp.setLayout(new BorderLayout(10,10));
cp.setBackground(Color.pink);

Font font=new Font("新細明體",Font.ITALIC+Font.BOLD,50);


//game.setSize(new Dimension(200,100));
//據說會被parent的setSize重設大小,按鈕在flowlayout看起來是wrap_content
//JButton會依照文字大小變化大小
game.setPreferredSize(new Dimension(50,50));
//無視版面配置自訂元件大小?? 在BorderLayout也沒用阿
//雖然大小解決了但是字體卻變成小黑點
//利用Font物件可以指定字體大小了
//但是flowlayout還是小黑點,結果好像是JButton大小裝不下這麼大的字體


game.setFont(font);

label.setSize(200, 100);
label.setFont(font);

cp.add(label,BorderLayout.NORTH);
//BorderLayout.North不寫的話預設放在中間且填滿整個螢幕
cp.add(game,BorderLayout.CENTER);

windows.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
windows.setVisible(true);

}

沒有留言:

張貼留言