文章目錄
- Jframe
- JDialog
- JPanel和JScrollPane容器
- 文本元件
- 按鈕元件
- 1.JCheckBox
- 2.JRadionButton
- JComboBox元件
- 菜單元件
- 1.下拉式菜單
- 2.彈出式菜單
- JTable
Swing包中提供了更加豐富、便捷、強大的GUI元件,而且這些元件都是Java語言編寫而成的,是以,Swing元件不依賴于本地平台,可以真正做到跨平台運作。通常來講,把依賴于本地平台的AWT元件稱為重量級元件,而把不依賴本地平台的Swing元件稱為輕量級元件。
大部分的Swing元件都是JComponent類的直接或者間接子類,而JComponent類是AWT中java.awt.Container的子類,說明Swing元件和AWT元件在繼承樹上形成了一定的關系。接下來通過一張繼承關系圖來描述一下AWT和Swing大部分元件的
關聯關系,如圖所示。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yN5UTO5EDMlNGZzU2NmlDNzYzXxMTO1cDM1EzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
圖中,展示了一些常用的Swing元件,不難發現,這些元件的類名和對應的AWT元件類名基本一緻,大部分都是在AWT組
件類名的前面添加了“J”,但也有一些例外,比如Swing的JComboBox元件對應的是AWT中的Choice元件(下拉框)。
通過圖中還可以看出,Swing中有三個元件是繼承了AWT的Window類,而不是繼承自JComponent類,它們分别是JWindow、JFrame、和JDialog,這三個元件是Swing中的頂級容器,它們都需要依賴本地平台,是以被稱為重量級元件。其中,JWindow和AWT中的Window一樣很少被使用,一般都是用JFrame和JDialog。
Jframe
在Swing元件中,最常見的一個就是JFrame,它和Frame一樣是一個獨立存在的頂級視窗,不能放置在其他容器之中,JFrame支援通用視窗所有的基本功能,例如視窗最小化、設定視窗大小等。
import javax.swing.*;
import java.awt.*;
public class JFrameEx extends JFrame {
public JFrameEx(){
this.setTitle("first swing jframe");
this.setSize(300,300);
JButton button=new JButton("按鈕");
this.setLayout(new FlowLayout());
this.add(button);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new JFrameEx();
}
}
JDialog
JDialog是Swing的另外一個頂級視窗,它和Dialog一樣都表示對話框。JDialog對話框可分為兩種:模态對話框和非模态對話框。所謂模态對話框是指使用者需要等到處理完對話框後才能繼續與其他視窗互動的對話框,而非模态對話框是允許使用者在處理對話框的同時與其他視窗互動的對話框。
對話框是模态或者非模态,可以在建立JDialog對象時為構造方法傳入參數來設定,也可以在建立JDialog對象後調用它的setModal()方法來進行設定。JDialog常見的構造方法如表所示。
表中,列舉了JDialog三個常用的構造方法,在這三個構造方法中都需要接收一個Frame類型的對象,表示對話框所有者,如果該對話框沒有所有者,參數owner可以傳入null。第三個構造方法中,參數modal用來指定JDialog視窗是模态還是非模态,如果modal值設定為true,對話框就是模态對話框,反之則是非模态對話框,如果不設定modal的值,其預設值為false,也就是非模态對話框。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JDialogEx {
public static void main(String[] args) {
JFrame jFrame=new JFrame("jframe");
JButton btn1=new JButton("模态對話框");
JButton btn2=new JButton("非模态對話框");
jFrame.add(btn1);
jFrame.add(btn2);
jFrame.setSize(300,300);
jFrame.setLocation(300,300);
jFrame.setLayout(new FlowLayout());
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
//
final JDialog dialog=new JDialog(jFrame,"Dialog");
final JLabel label=new JLabel();
final JButton btn3=new JButton("确定");
dialog.add(btn3);
dialog.setSize(150,150);
dialog.setLocation(350,350);
dialog.setLayout(new FlowLayout());
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.setModal(true);
if(dialog.getComponents().length==1){
dialog.add(label);
}
label.setText("模式對話框,惦記确定按鈕關閉");
dialog.setVisible(true);
}});
btn2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.setModal(false);
if(dialog.getComponents().length==1){
dialog.add(label);
}
label.setText("非模式對話框,點選确定按鈕關閉");
dialog.setVisible(true);
}});
btn3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.dispose();
}});
}
}
JPanel和JScrollPane容器
Swing元件中不僅具有JFrame和JDialog這樣的頂級視窗,還提供了一些中間容器,這些容器不能單獨存在,隻能放置在頂級視窗中。
其中最常見的中間容器有兩種:JPanel和JScrollPane
①JPanel:JPanel和AWT中的Panel元件使用方法基本一緻,它是一個無邊框,不能被移動、放大、縮小或者關閉的面闆,它的預設布局管理器是FlowLayout。當然也可以使用JPanel帶參數的構造函數JPanel(LayoutManager layout)或者它的setLayout()方法為其制定布局管理器。
②JScrollPane:與JPanel不同的是,JScrollPane是一個帶有滾動條的面闆容器,而且這個面闆隻能添加一個元件,如果想在JScrollPane面闆中添加多個元件,應該先将元件添加到JPanel中,然後将JPanel添加到JScrollPane中。
表中,列出了JScrollPane的三個構造方法,其中,第一個構造方法用于建立一個空的JScrollPane面闆,第二個構造方法用于建立顯示指定元件的JScrollPane面闆,這兩個方法都比較簡單。第三個構造方法,是在第二個構造方法的基礎上指定滾動條政策。如果在構造方法中沒用指定顯示元件和滾動條政策,也可以使用JScrollPane提供的方法進行設定,如下表所示。
package ch0806;
import javax.swing.*;
import java.awt.*;
public class JScrollPaneAndJPanel extends JFrame {
public JScrollPaneAndJPanel(){
this.setTitle("panel demo");
JScrollPane jScrollPane=new JScrollPane();
jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
JPanel jPanel=new JPanel();
jPanel.add(new JButton("按鈕1"));
jPanel.add(new JButton("按鈕2"));
jPanel.add(new JButton("按鈕3"));
jPanel.add(new JButton("按鈕4"));
jScrollPane.setViewportView(jPanel);
this.add(jScrollPane, BorderLayout.CENTER);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300,300);
this.setVisible(true);
}
public static void main(String[] args) {
new JScrollPaneAndJPanel();
}
}
文本元件
文本元件用于接收使用者輸入的資訊或向使用者展示資訊,其中包括文本框(JTextField)、文本域(JTextArea)等,它們都有一個共同父類JTextComponent。JTextComponent是一個抽象類,它提供了文本元件常用的方法,如表所示。
表中列出了幾種對文本元件進行操作的方法,其中包括選中文本内容、設定文本内容以及擷取文本内容等。由于JTextField和JTextArea這兩個文本元件都繼承了JTextComponent類,是以它們都具有表中的方法,但它們在使用上還有一定的差別。①JTextField:JTextField稱為文本框,它隻能接收單行文本的輸入。JTextField常用的構造方法,如下表所示。
表中,列出了四個JTextField的構造方法,在建立JTextField文本框時,通常使用第二個或者第四個構造方法,指定文本框的列數。
JTextField有一個子類JPasswordText,它表示一個密碼框,隻能接收使用者的單行輸入,但是在此框中不顯示使用者輸入的真實資訊,而是通過顯示指定的回顯字元作為占位符。新建立的密碼框預設的回顯字元為“*”。JPasswordText和
JTextField的構造方法相似。②JTextArea:JTextArea稱為文本域,它能接收多行的文本的輸入,使用JTextArea構造方法建立對象時可以設定區域的行數、列數。接下來,介紹一下JTextArea常用的構造方法,如下表所示。
表中,列出了四個JTextArea的構造方法,在建立文本域時,通常會使用最後兩個構造方法,指定文本域的行數和列數。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JTextFieldAndJTextArea extends JFrame {
private JButton sendBtn;
private JTextField inputField;
private JTextArea charContent;
public JTextFieldAndJTextArea(){
this.setLayout(new BorderLayout());
inputField=new JTextField(20);
sendBtn=new JButton("發送");
charContent=new JTextArea(12,34);
sendBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String content=inputField.getText();
if(content!=null && !content.trim().equals("")){
charContent.append("本人:"+content+"\n");
}else {
charContent.append("聊天消息不能為空");
}
inputField.setText("");
}
});
Label label=new Label("聊天資訊");
JScrollPane showPanel=new JScrollPane(charContent);
JPanel inputPanel=new JPanel();
inputPanel.add(label);
inputPanel.add(inputField);
inputPanel.add(sendBtn);
this.add(showPanel,BorderLayout.CENTER);
this.add(inputPanel,BorderLayout.SOUTH);
this.setTitle("聊天視窗");
this.setSize(400,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new JTextFieldAndJTextArea();
}
}
按鈕元件
在Swing中,常見的按鈕元件有JButton、JCheckBox、JRadioButton等,它們都是抽象類AbstractButton類的直接或間接子類。在AbstractButton類中提供了按鈕元件通用的一些方法,如表所示。
1.JCheckBox
JCheckBox元件被稱為複選框,它有選中(是)/未選中(非)兩種狀态,如果使用者想接收的輸入隻有“是”和“非”,則可以通過複選框來切換狀态。如果複選框有多個,則使用者可以選中其中一個或者多個。
下表列舉了建立JCheckBox對象的常用的構造方法。
表中,列出了用于建立JCheckBox對象的三個構造方法。其中,第一個構造方法沒有指定複選框的文本資訊以及狀态,如果想設定文本資訊,可以通過調用JCheckBox從父類繼承的方法來進行設定。例如調用setText(String text)來設定複選框文本資訊,調用setSelected(boolean b)方法來設定複選框狀态(是否被選中),也可以調用isSelected()方法來判斷複選框是否被選中。第二個和第三個構造方法都指定了複選框的文本資訊,而且第三個構造方法還指定了複選框初始化狀态是否被選中。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JCheckBoxEx extends JFrame {
private JCheckBox italic;
private JCheckBox bold;
private JLabel label;
public JCheckBoxEx(){
label=new JLabel("我們歡迎您",JLabel.CENTER);
label.setFont(new Font("宋體",Font.PLAIN,20));
italic=new JCheckBox("italic");
bold=new JCheckBox("bold");
this.add(label);
JPanel panel=new JPanel();
panel.add(italic);
panel.add(bold);
this.add(panel,BorderLayout.SOUTH);
ActionListener actionListener=new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int mode=0;
if(bold.isSelected()){
mode+=Font.BOLD;
}
if(italic.isSelected()){
mode+=Font.ITALIC;
}
label.setFont(new Font("宋體",mode,20));
}
};
italic.addActionListener(actionListener);
bold.addActionListener(actionListener);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300,300);
this.setVisible(true);
}
public static void main(String[] args) {
new JCheckBoxEx();
}
}
2.JRadionButton
JRadioButton元件被稱為單選按鈕,與JCheckBox複選框不同的是,單選按鈕隻能選中一個。就像随身聽上的播放和快進按鈕,當按下一個,先前按下的按鈕就會自動彈起。對于JRadioButton按鈕來說,當一個按鈕被選中時,先前被選中的按鈕就會自動取消選中。
由于JRadioButton元件本身并不具備這種功能,是以若想實作JRadioButton按鈕之間的互斥,需要使用javax.swing.ButtonGroup類,它是一個不可見的元件,不需要将其增加到容器中顯示,隻是在邏輯上表示一個單選按鈕組。将多個JRadioButton按鈕添加到同一個單選按鈕組對象中,就能實作按鈕的單選功能。表列舉了建立JRadioButton對象常見的構造方法。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JRadioButtonEx extends JFrame {
private ButtonGroup group;
private JPanel panel;
private JPanel pallet;
public JRadioButtonEx(){
pallet=new JPanel();
this.add(pallet, BorderLayout.CENTER);
panel=new JPanel();
group=new ButtonGroup();
addJRadioButton("灰");
addJRadioButton("粉");
addJRadioButton("黃");
this.add(panel,BorderLayout.SOUTH);
this.setSize(300,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
private void addJRadioButton(final String text){
JRadioButton radioButton=new JRadioButton(text);
group.add(radioButton);
panel.add(radioButton);
radioButton.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Color color=null;
if("灰".equals(text)){
color=Color.GRAY;
}else if("粉".equals(text)) {
color=Color.PINK;
}else if("黃".equals(text)){
color=Color.YELLOW;
}else {
color=Color.WHITE;
}
pallet.setBackground(color);
}
}
);
}
public static void main(String[] args) {
new JRadioButtonEx();
}
}
JComboBox元件
JComboBox元件被稱為組合框或者下拉清單框,它将所有選項折疊收藏在一起,預設顯示的是第一個添加的選項。當使用者單擊組合框時,會出現下拉式的選擇清單,使用者可以從中選擇其中一項并顯示。
JComboBox組合框元件分為可編輯和不可編輯兩種形式,對于不可編輯的組合框,使用者隻能在現有的選項清單中進行選擇,而對于可編輯的組合框,使用者既可以在現有的選項中選擇,也可以自己輸入新的内容。需要注意的是,自己輸入的内容隻能作為目前項顯示,并不會添加到組合框的選項清單中。表中列舉JComboBox類的常用構造方法。
在使用JComboBox時,需要用到它的一些常用方法,如表所示。
package ch0806;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JComboBoxEx extends JFrame {
private JComboBox comboBox;
private JTextField field;
public JComboBoxEx(){
JPanel panel=new JPanel();
comboBox=new JComboBox();
comboBox.addItem("請選擇城市");
comboBox.addItem("北京");
comboBox.addItem("天津");
comboBox.addItem("南京");
comboBox.addItem("上海");
comboBox.addItem("重慶");
comboBox.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String item=(String) comboBox.getSelectedItem();
if("請選擇城市".equals(item)){
field.setText("");
}else {
field.setText("您選擇的城市是:"+item);
}
}
}
);
field=new JTextField(20);
panel.add(comboBox);
panel.add(field);
this.add(panel,BorderLayout.NORTH);
this.setSize(350,100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new JComboBoxEx();
}
}
菜單元件
在GUI程式中,菜單是很常見的元件,利用Swing提供的菜單元件可以建立出多種樣式的菜單。
1.下拉式菜單
對于下拉式菜單,讀者肯定很熟悉,因為計算機中很多檔案的菜單都是下拉式的,如記事本的菜單。在GUI程式中,建立下拉式菜單需要使用三個元件:JMenuBar(菜單欄)、JMenu(菜單)和JMenuItem(菜單項),以記事本為例,這三個元件在菜單中對應的位置如圖所示。
圖中,分别指出了菜單的三個元件,接下來針對這三個元件進行詳細的講解。
(1)JMenuBar:JMenuBar表示一個水準的菜單欄,它用來管理菜單,不參與同使用者的互動式操作。菜單欄可以放在容器的任何位置,但通常情況下會使用頂級視窗(如JFrame、JDialog)的setJMenuBar(JMenuBar menuBar)方法将它放置在頂級視窗的頂部。JMenuBar有一個無參構造函數,建立菜單欄時,隻需要使用new關鍵字建立JMenuBar對象即可。建立完菜單欄對象後,可以調用它的add(JMenu c)方法為其添加JMenu菜單。
(2)JMenu:JMenu表示一個菜單,它用來整合管理菜單項。菜單可以是單一層次的結構,也可以是多層次的結構。大多情況下,會使用構造函數JMenu(String text)建立JMenu菜單,其中參數text表示菜單上的文本。JMenu中還有一些常用的方法,如表所示。
(3)JMenuItem:JMenuItem表示一個菜單項,它是菜單系統中最基本的元件。和JMenu菜單一樣,在建立JMenuItem菜單項時,通常會使用構造方法JMenumItem(String text)為菜單項指定文本内容。
由于JMenuItem類是繼承自AbstractButton類的,是以可以把它看成是一個按鈕。如果使用無參的構造方法建立了一個菜單項,則可以調用從AbstractButton類中繼承的setText(String text)方法和setIcon()方法為其設定文本和圖示。
package ch0806;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JMenusEx extends JFrame {
public JMenusEx(){
//确定視窗位置大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300,300);
this.setVisible(true);
//确定元件關系
JMenuBar menuBar=new JMenuBar();
this.setJMenuBar(menuBar);
JMenu menu=new JMenu("操作");
menuBar.add(menu);
JMenuItem item1=new JMenuItem("彈出視窗");
JMenuItem item2=new JMenuItem("關閉");
menu.add(item1);
menu.addSeparator();
menu.add(item2);
//确定元件監聽器
item1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JDialog dialog=new JDialog(JMenusEx.this,true);
dialog.setTitle("彈出視窗");
dialog.setSize(200,200);
dialog.setLocation(50,50);
dialog.setVisible(true);
}
});
item2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new JMenusEx();
}
}
2.彈出式菜單
對于彈出式菜單,相信大家也不會陌生,在Windows桌面單擊滑鼠右鍵會出現一個菜單,那就是彈出式菜單。在Java的Swing元件中,彈出式菜單用JPopupMenu表示。
JPopupMenu彈出式菜單和下拉式菜單一樣,都通過調用add()方法添加JMenuItem菜單項,但它預設是不可見的。如果想要顯示出來,則必須調用它的show(Component invoker,int x,int y)方法,該方法中參數invoker表示JPopupMenu菜單顯示位置的參考元件,x和y表示invoker元件坐标空間中的一個坐标,顯示的是JPopupMenu菜單的左上角坐标。
package ch0806;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class JPopMenuEx extends JFrame {
private JPopupMenu popupMenu;
public JPopMenuEx(){
this.setSize(300,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
popupMenu=new JPopupMenu();
JMenuItem refreshItem=new JMenuItem("refresh");
JMenuItem createItem=new JMenuItem("create");
JMenuItem exitItem=new JMenuItem("exit");
popupMenu.add(refreshItem);
popupMenu.add(createItem);
popupMenu.add(exitItem);
exitItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(e.getButton()==MouseEvent.BUTTON3){
popupMenu.show(e.getComponent(),e.getX(),e.getY());
}
}
});
}
public static void main(String[] args) {
new JPopMenuEx();
}
}
JTable
表格也是GUI程式中常用的元件,表格是一個由多行、多列組成的二維顯示區。Swing的JTable以及相關類提供了對這種表格的支援。使用了JTable以及相關類,程式既可以使用簡單代碼建立出表格來顯示二維資料,也可以開發出功能豐富的表格,還可以為表格定制各種顯示外觀、編輯特性。
使用JTable來建立表格是非常容易的事情,它可以把一個二維資料包裝成一個表格,這個二維資料既可以是一個二維數組,也可以是集合元素Vector對象(Vector裡面包含Vector形成二維資料)。除此之外,為了給該表格的每一列指定列标題,還需要傳入一個一維資料作為列标題,這個一維資料既可以是一維數組,也可以是Vector對象。
在使用JTable以前,先看一下它的構造函數有哪些,如表所示。
在表中,TableModel是用來存儲清單資料的,資料包括表頭的标題資料與表體的實體資料。TableModel為功能接口,通常使用其具體的實作類DefaultTableModel,其構造方法如下:
public DefaultTableModel(Object [] [] tbody,Object [] thead)
package ch0806;
import javax.swing.*;
public class JTableEx {
private JFrame frame=new JFrame("simple table");
private JTable table;
Object[] columnTitle={"姓名","年齡","性别"};
Object[][] tableData={
new Object[]{"李清照",29,"女"},
new Object[]{"蘇格拉底",56,"男"},
new Object[]{"李白",35,"男"},
new Object[]{"弄玉",18,"女"},
new Object[]{"虎頭",2,"男"}
};
public void init(){
table=new JTable(tableData,columnTitle);
frame.add(new JScrollPane(table));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) {
new JTableEx().init();
}
}