主要内容
Java Swing概述 窗口 常用组件与布局 处理事件 使用MVC结构 对话框 发布GUI程序
一、Java Swing概述
Java的Swing工具包中包含了许多类来支持GUI(图形用户界面)设计。如:按钮、菜单、列表、文本框等组件类,同时它还包含窗口、面板等容器类。
JComponent类是java.awt包中Container类的一个直接子类、是java.awt包中Component类的一个间接子类,学习GUI编程主要是学习掌握使用Component类的一些重要子类及其使用方法。

GUI编程基本知识点
(1) Java把Component类的子类或间接子类创建的对象称为一个组件.
(2) Java把Container类的子类或间接子类创建的对象称为一个容器.
(3) 可以向容器添加组件。Container类提供了一个public方法:add( ),一个容器可以调用这个方法将组件添加到该容器中。
(4) 容器调用removeAll()方法可以移掉容器中的全部组件;调remove(Component c)方法可以移掉容器中参数c指定的组件。
(5)注意到容器本身也是一个组件,因此可以把一个容器添加到另一个容器中实现容器的嵌套。
(6)每当容器添加新的组件或移掉组件时,应当让容器调用validate()方法,以保证容器中的组件能正确显示出来
java
例如:
JFrame f=new JFrame();
JButton button=new JButton("确定")
f.add(button);
.......
f.remove(button);
二、窗口
Java提供的JFrame类的实例是一个底层容器,即通常所称的窗口。其他组件必须被添加到底层容器中,以便借助这个地层容器和操作系统进行信息交互。
JFrame类是Container类的间接子类。当需要一个窗口时,可使用JFrame或其子类创建一个对象。
窗口也是一个容器,可以向窗口添加组件。需要注意的是,窗口默认地被系统添加到显示器屏幕上,因此不允许将一个窗口添加到另一个容器中。简单说就是 "窗口是独立显示的,不能嵌套进其他容器里"。其他容器(除了窗口)可以实现嵌套。
1、JFrame常用方法
JFrame构造方法:
JFrame() 创建一个无标题的窗口。
JFrame(String s) 创建标题为s的窗口。
常用方法:
-
public void setBounds(int a,int b,int width,int height) 设置窗口的初始位置是(a,b),即距屏幕左面a个像素、距屏幕上方b个像素;窗口的宽是width,高是height。
-
public void setSize(int width,int height) 设置窗口的大小。
-
public void setLocation(int x,int y) 设置窗口的位置,默认位置是(0,0)。
-
public void setVisible(boolean b) 设置窗口是否可见,窗口默认是不可见的。
-
public void setResizable(boolean b) 设置窗口是否可调整大小,默认可调整大小。
-
public void dispose() 撤消当前窗口,并释放当前窗口所使用的资源。
-
public void setExtendedState(int state) 设置窗口的扩展状态.
-
public void setDefaultCloseOperation(int operation) 该方法用来设置单击窗体右上角的关闭图标后,程序会做出怎样的处理。如:EXIT_ON_CLOSE
9)public void setLayout(LayoutManager mgr) 设置此容器的布局管理器。
10)public Component add(Component comp) 将指定组件追加到此容器的尾部。
11)public void setMenuBar(MenuBar mb) 将此 frame 的菜单栏设置为指定的菜单栏。
12)public void validate() 使用 validate 方法会使容器再次布置其子组件。在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。
13)setTitle(s);//设置窗口标题
例子9_1用JFrame创建了两个窗口w1和w2
java
import javax.swing.*;
import java.awt.*;
public class Example9_1 {
static void main(String[] args) {
JFrame w1 = new JFrame("第一个窗口");
JFrame w2 = new JFrame("第二个窗口");
//创建一个容器:Container类的子类或间接子类创建的对象称为一个容器
Container con = w1.getContentPane();
//设置窗口的背景色
con.setBackground(Color.yellow);
//设置窗口在屏幕上的位置及大小
w1.setBounds(60,100,188,108);
w2.setBounds(260,100,188,108);
w1.setVisible(true);
w1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//释放当前窗口
w2.setVisible(true);
w2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出程序(和上面w1不一样)
}
}
程序运行效果如图👇

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) 的意思是:
当关闭这个窗口时,只释放当前窗口的资源 (把这个窗口关掉),但不会结束整个程序。
现在开了 2 个窗口(w1和w2),当关闭其中一个时,另一个窗口还在运行(程序没结束);只有把两个窗口都关闭,程序才会退出。
如果想让 "关闭任意一个窗口就结束整个程序",可以把这两行改成:
java
w1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
w2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
2、菜单条、菜单、菜单项
菜单条(MenuBar)
JComponent类的子类JMenubar负责创建菜单条,JFrame类有一个将菜单条放置到窗口中的方法:setJMenuBar(JMenuBar bar);该方法将菜单条添加到窗口的顶端。
菜单条JMenuBar类构造方法:JMenuBar(); JMenuBar Mbar=new JMenuBar()
菜单(Menu)
JComponent类的子类JMenu负责创建菜单。
菜单JMenu类构造方法:JMenu() ; JMenu(String s) ; JMenu m=new JMenu();
常用方法:
public void add(JMenuItem item) 向菜单增加由参数item指定的菜单项
public JMenuItem getItem(int n) 得到指定索引处的菜单选项。
public int getItemCount() 得到菜单选项的数目。
菜单项(MenuItem)
JComponent类的子类JMenuItem负责创建菜单项,JMenuItem类的主要方法有以下几种:
JMenuItem(String s) 构造有标题的菜单项。
JMenuItem(String text, Icon icon) 构造有标题和图标的菜单项
public void setAccelerator(KeyStroke keyStroke)为菜单项设置快捷键
例子9_2
java
import javax.swing.*;
import java.awt.*;
public class Example9_2 {
public static void main(String[] args) {
WindowMenu win = new WindowMenu("带菜单的窗口",20,30,600,290);
}
}
/*
因为 JFrame 是 Java Swing 里用来创建窗口的类,
所以WindowMenu类相当于 "一个自定义的窗口类",
后续可以用它来创建窗口对象。
核心是利用 "继承" 特性复用 JFrame 的窗口功能,同时定制自己需要的窗口逻辑
在WindowMenu类里,
你能加自己的代码(比如设置窗口大小、添加按钮、定义点击按钮的行为),
让这个窗口变成你想要的样子;
*/
class WindowMenu extends JFrame{
//菜单条
JMenuBar menubar;
//菜单1
JMenu menuFruit;
//菜单项1
JMenuItem bananaItem,pearItem;
//菜单2
JMenu appleMenu;
//菜单项2
JMenuItem greenAppleItem,redAppleItem;
//构造器
public WindowMenu() {
}
//方法1:设置基本的东西
public WindowMenu(String s,int x,int y,int w,int h){
//方法2
init(s);
//父类JFrame方法
setLocation(x,y);
setSize(w,h);
setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
//方法2:设置菜单
void init(String s){
//设置窗口标题
setTitle(s);
//创建菜单条
menubar = new JMenuBar();
//用menufruit做根菜单
menuFruit = new JMenu("水果菜单");//根菜单
//创建菜单1的菜单项
bananaItem = new JMenuItem("香蕉");
bananaItem.setIcon(new ImageIcon("banana.png"));
pearItem = new JMenuItem("甜梨");
pearItem.setIcon(new ImageIcon("pear.png"));
appleMenu = new JMenu("苹果");//分支菜单?
//创建菜单2的菜单项
greenAppleItem = new JMenuItem("绿苹果");
greenAppleItem.setIcon(new ImageIcon("greenApple.png"));
redAppleItem = new JMenuItem("红苹果");
redAppleItem.setIcon(new ImageIcon("redApple.png"));
menuFruit.add(bananaItem);//为菜单添加菜单项
menuFruit.add(pearItem);//为菜单添加菜单项
//为菜单添加分隔线
menuFruit.addSeparator();
//用菜单也可以添加菜单
menuFruit.add(appleMenu);
appleMenu.add(greenAppleItem);
appleMenu.add(redAppleItem);
//在菜单条中添加menuFruit菜单
menubar.add(menuFruit);
//在窗口中放置菜单条
setJMenuBar(menubar);
}
}
三、常用组件与布局
菜单条可以使用JComponent的子类JTextField创建各种组件。利用组件可以完成应用程序与用户的交互及事件处理等。
1、常用组件
- 文本框:由JComponent的子类JTextField创建文本框。
(1)构造函数:JTextField( ) ; JTextField(int columns) ;
(2)常用方法:
public String getText();
public void setText(String t);
- 文本区:由JComponent的子类JTexArea创建文本区。
(1)构造函数:JTextArea() ;JTextArea(int rows, int columns)
(2)常用方法:
public String getText();
public void setText(String t);
- 按钮:由JComponent的子类JButton类用来创建按钮。
(1)构造函数:JButton() ; JButton(String text) ;
(2)常用方法:public void addActionListener(ActionListener l);
- 标签:由JComponent的子类JLabel类用来创建标签。
(1)构造函数:JLabel() ; JLabel(String text) ; JLabel(Icon image) ;
(2)常用方法:
public String getText();
public void setText(String t);
- 选择框:由JComponent的子类JCheckBox类用来创建选择框。
(1)构造函数: JCheckBox() ; JCheckBox(String text) ;
(2)常用方法:
public void addItemListener(ItemListener l)
public void addActionListener(ActionListener l)
ItemListener接口中:Object getItemSelectable()相当于getSource();
public int getStateChange(); 若被选中SELECTED/DESEELCTED
- 单选按钮:由JComponent的子类JRadioButton类用来创建单项选择框。
(1)构造函数: JRadioButton() ; JRadioButton(String text) ;
(2)常用方法: public void addItemListener(ItemListener l)
7.下拉列表:由JComponent的子类JComboBox类用来创建下拉列表。
(1)构造函数:JComboBox() ; JComboBox(Object[] items)
(2)常用方法: public void addItemListener(ItemListener l)
public Object getSelectedItem();
public int getSelectedIndex()
- 密码框:由JComponent的子类JPasswordField创建密码框.
(1)构造函数:JPasswordField() ; JPasswordField(int columns)
(2)常用方法:
public String getText();
public void setText(String t);
public void setEchoChar(char c)使用该方法重新设置回显字符.
public char[] getPassword()方法可以返回实际的密码
例子9_3(Example9_3.java , ComponentInWindow.java )包含有上面提到的常用组件。
java
import javax.swing.*;
import java.awt.*;
public class Example9_3 {
public static void main(String[] args) {
componentInWindow Window = new componentInWindow();
Window.setBounds(100,100,450,260);
Window.setTitle("常用组件");
}
}
class componentInWindow extends JFrame{
//复选框
JCheckBox checkBox1,checkBox2;
//单选按钮
JRadioButton radioM,radioF;
ButtonGroup group;
//下拉列表
JComboBox<String> comBox;
public componentInWindow(){
init();
setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
void init(){
setLayout(new FlowLayout());
comBox = new JComboBox<String>();
checkBox1 = new JCheckBox("喜欢音乐");
checkBox2 = new JCheckBox("喜欢旅游");
group = new ButtonGroup();
radioM = new JRadioButton("男");
radioF = new JRadioButton("女");
group.add(radioM);
group.add(radioF);
add(checkBox1);
add(checkBox2);
add(radioM);
add(radioF);
comBox.addItem("音乐天地");
comBox.addItem("武术天地");
add(comBox);
}
}
运行结果👇
