本文章讲述了 java swing方面,控件,布局的基本用法:
控件包括:
1.JLabel
2.JPanel
3.JButton
4.JToggleButton
5.JCheckBox
6.JRadioButton
7.JList
8.JComboBox
9.JScrollPane
10.JSlider
11.JTextField
12.JTextArea
13.JPasswordField
布局包括:
1.FlowLayout
2.GridLayout
3.BorderLayout
4.CardLayout
JLabel:
一個JLabel物件可顯示文字或影像,但JLabel物件是一個被動的元件,不能讓使用者選擇點選 ,例如滑鼠的相關動作並不能使JLabel物件有所反應,且它只能唯讀文字,不能更改Label的內容。
此外,JLabel物件可以透過setDisplayedMnemonic(char aChar)方法來設定輔助鍵,以及設定輔助鍵時必須同時呼叫setLabelFor(Component c)方法好指定這個標籤所伴隨的元件,也就是當使用者使用輔助鍵時,焦點也會轉移到所指定的元件c上。
-----------------------------------------------------------------------------------------------------------------------
声明:JLabel label=new JLabel(String string[,Icon icon][,Int Alignment]);
例:JLabel label=new JLabel("Small",new ImageEcon("images/small.gif"),SwingConstants.LEFT);
JLabel label=new JLabel(new ImageEcon("images/small.gif"),SwingConstants.LEFT);
JLabel label=new JLabel("Small",SwingConstants.LEFT);
JLabel label=new JLabel("Small");
===========================================================================
JPanel:
JPanel物件也屬於container的一種,基本上panel物件並不提供一個環境讓使用者可以任意作繪圖動作。
panel物件有兩個優點是:
容易在panel上增加邊框borders的設計
使用雙重緩衝(double-buffered)方式來繪製各種元件。
JPanel物件預設情形是不透明的物件,但也可呼叫setOpaque(false)方法改變JPanel物件成為一個透明物件。
public JPanel( ) --建立一個新的panel,預設的版面管理方式是FlowLayout以及double-buffering的功能,可
使用額外的記憶體空間讓執行速度較快且元件更新時不會閃爍。Applet也是從panel繼承來的,panel元件可
用add方法加在applet裡面。
public JPanel(boolean isDoubleBuffered) --建立一個新的panel,預設版面管理方式是FlowLayout,且根據
參數值true或false決定要不要double-buffering。
public JPanel(LayoutManager layout) --建立一個新的panel,使用指定的版面管理方式。
public JPanel(LayoutManager layout, boolean isDoubleBuffered) --建立一個新的panel,使用指定的版面管
理方式,且根據參數值true或false決定要不要double-buffering。
JButton
public class JButton extends AbstractButton implements Accessible
建立一個按鈕物件時通常還需另外定義這個按鈕相對應的事件反應行為,所以不只單純地產生一個按鈕物件,還需同時定義事件處理(ActionListener)。
public JButton() --建立一個空白的按鈕。
public JButton(Action a) --按鈕物件的屬性是由行為a介面所提供的。
public JButton(Icon icon) --以指定的影像作為按鈕的樣式。
public JButton(String text) --以指定的字串作為按鈕的說明文字。
public JButton(String text, Icon icon) --建立一個包含文字說明和影像的按鈕。
<------------------------------------------------------------->
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
public class JButtonDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("JButton Demo");
ImageIcon icon = new ImageIcon("arrow.jpg",
"a simple picture");
Container c = frame.getContentPane();
c.setLayout(new GridLayout(3,1));
JButton button1=new JButton("A Simple text Button");
JButton button2=new
JButton("A Button with an image",icon);
JButton button3=new
JButton("<html><font size=-1><b>HTML format </b>
Button</font>");
Border b1=BorderFactory.createLineBorder(Color.red,3);
Border b2=BorderFactory.createBevelBorder
(BevelBorder.RAISED,Color.yellow,Color.blue);
button1.setBorder(b1);
button2.setBorder(b2);
button2.setBackground(Color.pink);
button1.setMnemonic('S');
c.add(button1);
c.add(button2);
c.add(button3);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
</code>
frame.setVisible(true);
}
}
JToggleButton
public class JToggleButton extends AbstractButton implements Accessible
一個JToggleButton元件是屬於可在兩種狀態切換的按鈕,JToggleButton的建構子參數使用和JButton建構子的意義是大致相同的,唯一差別於JToggleButton按鈕預設狀態是unselected。
public JToggleButton() --一個空白的按鈕,預設值是unselected。
public JToggleButton(Action a) --將使用者在GUI介面程式所建立的參數作為建立按鈕的初始值。
public JToggleButton(Icon icon) --一個有影像的按鈕,預設值是unselected。
public JToggleButton(Icon icon, boolean selected) --一個有影像的按鈕,預設值可以另外設定true/false。
public JToggleButton(String text) --一個帶有文字說明的按鈕,預設值是unselected。
public JToggleButton(String text, boolean selected) --一個帶有文字說明的按鈕,預設值是可以另外設定true/false。
public JToggleButton(String text, Icon icon) --一個帶有文字說明和影像的按鈕,預設值是unselected。
public JToggleButton(String text, Icon icon, boolean selected) --帶有文字說明和影像的按鈕,預設值可以另外設定true/false。
<------------------------------------------>
import javax.swing.*;
import java.awt.*;
public class JToggleDemo {
public static void main(String args[]) {
JFrame frame = new JFrame("HelloWorldSwing1");
Container c= frame.getContentPane();
c.setLayout(new GridLayout(0,1));
JToggleButton b1=new JToggleButton("Unselected button");
c.add(b1);
JToggleButton b2=new
JToggleButton("Selected button",true);
c.add(b2);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
JCheckBox
public class JCheckBox extends JToggleButton implements Accessible
一個JCheckBox元件是屬於兩種狀態的元件,選取或不選取;JCheckBox元件和JToggleButton元件操作方式是一樣的,只有外觀不同,通常被選取的是伴隨著JCheckBox元件的圖示被選取而不是整個元件被選取。
public JCheckBox( ) --建立一個空白的核取方塊,預設值是unselected。
public JCheckBox(Action a) --將使用者在GUI介面程式所建立的參數作為建立核取方塊的初始值。
public JCheckBox(Icon icon) --建立一個有影像的核取方塊,預設值是unselected。
public JCheckBox(Icon icon, boolean selected) --建立一個有影像的核取方塊,預設值可以另外設定true/false。
public JCheckBox(String text) --建立一個帶有文字說明的核取方塊,預設值是unselected。
public JCheckBox(String text, boolean selected) --建立一個帶有文字說明的核取方塊,預設值是可以另外設定true/false。
public JCheckBox(String text, Icon icon) --建立一個帶有文字說明和影像的核取方塊,預設值是unselected。
public JCheckBox(String text, Icon icon, boolean selected) --建立一個帶有文字說明和影像的核取方塊,預設值是可另外設定true/false。
<----------------------------------------------->
import javax.swing.*;
import java.awt.*;
public class CheckBoxDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing1");
Container c = frame.getContentPane();
c.setLayout(new GridLayout(2,1));
JCheckBox cb1=new JCheckBox("AAA");
JCheckBox cb2=new JCheckBox("BBB");
c.add(cb1);
c.add(cb2);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
JRadioButton
public class JRadioButton extends JToggleButton implements Accessible
如想要定義一群互斥的按鈕,一次只能允許選取一個選項,必須先建立一個ButtonGroup,然後使用add( )方法,將JRadioButton元件一個個加到ButtonGroup裡,才能達到一次只能在選項中選一個的目的。
ButtonGroup只是一個抽象的群組,並不代表這些單選按鈕元件是一個群組。
public JRadioButton() --建立一個空白的單選按鈕,預設值是unselected。
public JRadioButton(Action a) --將使用者在GUI介面程式所建立的參數作為建立單選按鈕的初始值。
public JRadioButton(Icon icon) --建立一個有影像的單選按鈕,預設值是unselected。
public JRadioButton(Icon icon, boolean selected) --建立一個有影像的單選按鈕,預設值可以另外設定true/false。
public JRadioButton(String text) --建立一個帶有文字說明的單選按鈕,預設值是unselected。
public JRadioButton(String text, boolean selected) --建立一個帶有文字說明的單選按鈕,預設值是可以另外設定true/false。
public JRadioButton(String text, Icon icon) --建立一個帶有文字說明和影像的單選按鈕,預設值是unselected。
public JRadioButton(String text, Icon icon, boolean selected) --建立一個帶有文字說明和影像的單選按鈕,預設值是可另外設定true/false。
<--------------------------------------->
import java.awt.*;
import javax.swing.*;
class JRadioButtonDemo {
public static void main(String args[]) {
JFrame frame = new JFrame("JList Demo");
Container c = frame.getContentPane();
c.setLayout(new GridLayout(0,1));
ButtonGroup bg=new ButtonGroup();
JRadioButton op1=new JRadioButton("first choice",true);
bg.add(op1);
c.add(op1);
JRadioButton op2=new
JRadioButton("second choice",false);
bg.add(op2);
c.add(op2);
JRadioButton op3=new JRadioButton("third choice",false);
bg.add(op3);
c.add(op3);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
JList
public class JList extends JComponent implements Scrollable, Accessible
基本上,當建立一個JList清單方塊時,預設值是不包含捲動功能的,因此必須透過JscrollPane元件提供捲動功能,否則超出畫面的內容就無法看見
List清單元件有個重要特性是:允許多重選擇,當建立一個JList元件時,預設值是可多重選擇。
也可改變這個特性,透過setSelectionMode(int mode)方法來設定JList清單元件的選擇模式,總共有三種情形:
SINGLE_SELECTION
SINGLE_INTERVAL_SELECTION
MULTIPLE_INTERVAL_SELECTION。
public JList( ) --建立一個空的清單方塊。
public JList(ListModel dataModel) --藉由dataModel物件建立一個新的清單方塊元件。
public JList(Object[ ] listData) --傳入一個陣列物件的值作為清單方塊的內容。
public JList(Vector listData) --傳入一個Vector型態的物件作為清單方塊的初始值。
JComboBox
public class JComboBox extends JComponent implements ItemSelectable, ListDataListener, ActionListener,Accessible
JComboBox元件有點類似一群互斥的選項集中放在一個可隱藏起來的下拉式清單,甚至還允許使用者可以編輯,這樣可減少整個畫面所佔的空間。
JList元件和JComboBox元件這兩個元件有以下幾點差異:
JList元件是用在有很長的項目列表時。
當需要多重選擇時,可以選擇JList元件。
JComboBox元件較節省空間。
JComboBox元件支援未列入清單內的選項。
public JComboBox( ) --建立一個空的清單方塊。
public JComboBox(ComboBoxModel aModel) --
藉由dataModel物件建立一個新的清單方塊元件。
public JComboBox(Object[ ] items) --傳入一個陣列物件的值作為清單方塊的內容。
public JComboBox(Vector items) --傳入一個Vector型態的物件作為清單方塊的初始值。
JScrollPane
public class JScrollPane extends JComponent implements Adjustable, Accessible
一個捲動框包含垂直和水平的捲動軸,並可選擇呈現在畫面上的捲動框的大小,也就是有多少rows和coloumns。
public JScrollPane() --建立一個空白的捲動面板,其垂直和水平的捲軸視需要而出現。
public JScrollPane(Component view) --以指定的元件顯示在捲動面板上。
public JScrollPane(int vsbPolicy, int hsbPolicy) --建立一個空白的捲動面板,且設定垂直和水平的政策。
public JScrollPane(Component view, int vsbPolicy, int hsbPolicy) --以指定的元件顯示在捲動面板上,且設定垂直和水平的政策。
垂直政策:
VERTICAL_SCROLLBAR_ALWAYS,
VERTICAL_SCROLLBAR_AS_NEEDED,
VERTICAL_SCROLLBAR_NEVER。
水平政策:
HORIZONTAL_SCROLLBAR_ALWAYS,
HORIZONTAL_SCROLLBAR_AS_NEEDED,
HORIZONTAL_SCROLLBAR_NEVER。
<----------------------------------------->
import java.awt.*;
import javax.swing.*;
class JScrollPaneDemo {
public static void main(String args[]) {
JFrame frame = new JFrame("JScrollPane Demo");
Container c = frame.getContentPane();
c.setLayout(new BorderLayout());
Icon icon = new ImageIcon("fruit.gif");
JLabel label1 = new JLabel("捲動面板示範",
icon,JLabel.CENTER);
JScrollPane pane=new JScrollPane(label1,JScrollPane.
VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
c.add(pane,BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
JSlider
public class JSlider extends JComponent implements SwingConstants, Accessible
JSlider元件可讓使用者使用滑鼠點選一個明確的數值,當建立一個JSlider元件時,通常都會給予一組區間數字(最小值到最大值之間),例如:1和10。則使用者透過JSlider元件所點選的位置所傳回來的數值一定介於1和10之間。
public JSlider() --建立一個水平的JSlider元件,區間值從0到100,初始值設為50。
public JSlider(BoundedRangeModel brm) --藉由brm物件建立一個水平的JSlider元件,這物件管理JSlider元件的最小值、最大值、目前的數值和它們之間的關係。
public JSlider(int orientation) --指定JSlider元件的方向為水平或垂直,參數值是JSlider.VERTICAL、JSlider.HORIZONTAL;區間值從0到100,初始值設為50。
public JSlider(int min, int max) --建立一個水平的JSlider元件,區間值從min到max,初始值設為(min+max)/2。
public JSlider(int min, int max, int value) --建立一個水平的JSlider元件,區間值從min到max,初始值設為value。
public JSlider(int orientation, int min, int max, int value) --指定JSlider元件的方向為水平或垂直,區間值從min到max,初始值設為value。
<---------------------------------------------------->
import java.awt.*;
import javax.swing.*;
import java.util.*;
class JSliderDemo {
public static void main(String args[]) {
JFrame frame = new JFrame("JSlider Demo");
Container c = frame.getContentPane();
c.setLayout(new BorderLayout());
JSlider hs=new JSlider(JSlider.HORIZONTAL,0,20,2);
Hashtable h= new Hashtable();
h.put(new Integer(2), new JLabel("2"));
h.put(new Integer(8), new JLabel("8"));
h.put(new Integer(14), new JLabel("14"));
h.put(new Integer(20), new JLabel("20"));
hs.setLabelTable(h);
hs.setPaintLabels(true);
JSlider vs=new JSlider(JSlider.VERTICAL,10,100,30);
vs.setMajorTickSpacing(10);
vs.setPaintLabels(true);
c.add(hs,BorderLayout.SOUTH);
c.add(vs,BorderLayout.EAST);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
JTextField
public class JTextField extends JComponent implements SwingConstants
一個JTextField元件可讓使用者在GUI程式裡輸入一行的文字,且也可以透過JTextField的方法來設定使用者輸入文字的字型和對齊方式等。
此外,如希望輸入文字後,按下ENTER鍵有反應,則須定義相對應的事件傾聽器,導引到指定的動作。
public JTextField() --建立一個空白的文字欄位。
public JTextField(Document doc, String text, int columns) --建立一個文字欄位。
public JTextField(int columns) --建立一個空白的文字欄位,且指定文字欄位的長度大小。
public JTextField(String text) -- 以指定的字串當作文字欄位的預設值。
public JTextField(String text, int columns) --以指定的字串當作文字欄位的預設值,並且指定文字欄位的長度大小。
<--------------------------------------------------->
import java.awt.*;
import javax.swing.*;
class JTFDemo {
public static void main(String args[]) {
JFrame frame = new JFrame("JTextField Demo");
Container c = frame.getContentPane();
c.setLayout(new FlowLayout());
JTextField t1=new JTextField("Type here",20);
c.add(t1);
JTextField t2=new JTextField("14.0",8);
t2.setHorizontalAlignment(JTextField.RIGHT);
c.add(t2);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
JTextArea
public class JTextArea extends JComponent
相較於JTextField元件只能輸入一行的文字,JTextArea元件則可設定讓使用者最多可以輸入多少行的文字。不過得注意的是,JTextArea元件必須放在JScrollPane元件中。
public JTextArea( ) --建立一個新的文字區域方塊,預設值是null,且rows和columns為0。
public JtextArea(Document doc) --以指定的Document元件作為文字區域方塊的模型樣式。
public JTextArea(Document doc, String text, int rows, int columns) --以指定的Document元件作為文字區域方塊的模型樣式,且初始字串設為text,文字區域方塊的長和寬須大於等於0,否則會有IllArgumentException。
public JTextArea(int rows, int columns) --設定文字區域方塊的長和寬,參數值必須大於等於0,否則會有IllArgumentException。
public JTextArea(String text) --設定文字區域方塊的初始顯示字串text。
public JTextArea(String text, int rows, int columns) --設定文字區域方塊的初始顯示字串text,且文字區域方塊的長和寬,參數值必須大於等於0,否則會有IllArgumentException。
<----------------------------------------------->
import java.awt.*;
import javax.swing.*;
class JTADemo {
public static void main(String args[]) {
JFrame frame = new JFrame("JTextArea Demo");
Container c = frame.getContentPane();
c.setLayout(new FlowLayout());
String s="Short as life is we make it still shorter \n"
+"by the careless waste of time. \n"
+"Every thinks of changing the world, but no \n"
+"one thinks of changing himeself";
JTextArea ta1=new JTextArea(s,3,20);
JScrollPane pane = new JScrollPane(ta1);
c.add(pane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
JPasswordField
public class JPasswordField extends JTextField
這元件和JTextField元件類似,只有單行輸入,不過看不到輸入的實際內容,而是用其他符號回應在螢幕上,這也符合輸入密碼的隱私性,不能隨意讓別人看到內容。
public JPasswordField( ) --建立一個空白的密碼欄位元件。
public JPasswordField(Document doc, String text, int columns) --指定一種文件模型
public JPasswordField(int columns) --設定密碼欄位元件的長度。
public JPasswordField(String text) --設定一個字串為密碼欄位的初始值。
public JPasswordField(String text, int columns) --設定一個字串為密碼欄位的初始值及長度。
<------------------------------------------------>
import java.awt.*;
import javax.swing.*;
class JPFDemo {
public static void main(String args[]) {
JFrame frame = new JFrame("JPasswordField Demo");
Container c = frame.getContentPane();
c.setLayout(new FlowLayout());
JPasswordField p1=new JPasswordField(10);
c.add(p1);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
版面處理
1.FlowLayout
FlowLayout版面管理員通常會安排元件從左到右依序放置,且會根據container的大小來調整元件的大小以及換行的動作。
public FlowLayout( ) --預設對齊方式是向中對齊且水平和垂直的間隔都是5 unit。
public FlowLayout(int align) --指定對齊方式,這個參數的值必須是下列三者之一:FlowLayout.RIGHT、FlowLayout.LEFT、FlowLayout.CENTER;且水平和垂直的間隔都是5 unit。
FlowLayout版面管理員是applets和Panels的預設值。在applet類別方法裡,寫法為SetLayout(new FlowLayout(align)),且版面是用add方法把元件加上。
public FlowLayout(int align, int hgap, int vgap) --指定對齊方式,這個參數的值必須是下列三者之一:FlowLayout.RIGHT、FlowLayout.LEFT、FlowLayout.CENTER;此外、第二個參數和第三個參數則可分別指定水平和垂直間隔的距離。
<---------------------------------------------------------->
import javax.swing.*;
import java.awt.*;
public class FlowLayoutDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("BorderLayout Demo");
Container c = frame.getContentPane();
c.setLayout(new FlowLayout());
JButton button1 = new JButton("Flow");
JButton button2 = new JButton("Layout");
JLabel label1 = new JLabel("FlowLayout Demo");
c.add(button1);
c.add(button2);
c.add(label1);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
2.GridLayout
public class GridLayout extends Object implements LayoutManager, Serializable
GridLayout版面管理員以矩形格子為基礎,將指定的container劃分成數個相同大小的區域,每個區域只能放入一個元件;且一般預設排列方式是從左到右水平排列,或者也可改變container的ComponentOrientation屬性,將排列方式改成從右到左。
public GridLayout() --預設值只有一個row。SetLayout(new GridLayout(2,3,4,5)格式,是用add方法把元件加在版面上。
public GridLayout(int rows, int cols) --在container內劃分rows*cols個矩形的區域。且這兩個參數只能有一個是0。
public GridLayout(int rows, int cols, int hgap, int vgap) --在container內劃分rows*cols個矩形的區域。且這兩個參數只能有一個是0。hgap和vgap參數表示水平和垂直矩形格子的間隔距離。
<----------------------------------------------->
import javax.swing.*;
import java.awt.*;
public class GridLayoutDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("GridLayout Demo");
Container c = frame.getContentPane();
c.setLayout(new GridLayout());
JButton button1 = new JButton("1");
JButton button2 = new JButton("2");
JButton button3 = new JButton("3");
JButton button4 = new JButton("4");
JButton button5 = new JButton("5");
c.add(button1);
c.add(button2);
c.add(button3);
c.add(button4);
c.add(button5);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
3.BorderLayout
BorderLayout版面管理員定義了五個元件擺設的區域(絕對位置):North、South、West、East、Center,且每個區域最多只能有一個元件;另外還有一組標示相對位置的常數:PAGE_START、PAGE_END、LINE_START、LINE_END。這兩組常數最好不要混合使用。
public BorderLayout() --建立一個標準的BorderLayout版面管理,預設間隔是零。
public BorderLayout(int hgap, int vgap) --設定元件和元件水平和垂直之間的間隔。SetLayout(new BorderLayout(5,5)),用add方法把元件加在版面上,寫法為add(component, BorderLayout.NORTH)。
import javax.swing.*;
import java.awt.*;
public class BorderLayoutDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("BorderLayout Demo");
Container c = frame.getContentPane();
c.setLayout(new BorderLayout());
JButton button1 = new JButton("North");
JButton button2 = new JButton("South");
JButton button3 = new JButton("Center");
JButton button4 = new JButton("West");
JButton button5 = new JButton("East");
c.add(button1,BorderLayout.NORTH);
c.add(button2,BorderLayout.SOUTH);
c.add(button3,BorderLayout.CENTER);
c.add(button4,BorderLayout.WEST);
c.add(button5,BorderLayout.EAST);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
4.CardLayout
CardLayout版面管理員不像其他的版面管理員一樣,可任意安排元件的擺放位置,它只是讓你可以定義n個”卡片”,讓設計的畫面,可隨著卡片做切換,且每次只能看見一張卡片;但須使用JTabbedPane容器,來實現這種情形。
<----------------------------------------------------->
import java.awt.*;
import javax.swing.*;
public class CardDemo1 extends JFrame {
//CardDemo1()建構子
public CardDemo1() {
JTabbedPane tp=new JTabbedPane();
for (int i=0; i<3; i++) {
JButton bon=new JButton("Card " + i + " Button");
tp.addTab("button"+i,bon) ;
}
getContentPane().add(tp,BorderLayout.CENTER);
} //end of CardDemo1 constructor
public static void main(String args[]) {
JFrame f= new CardDemo1();
f.setSize(300,150);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} //end of main()
}