Swing 是 GUI(图形用户界面) 开发工具包, 内容有很多, 这里会分块编写, 但在进阶篇中只编写 Swing 中的基本要素, 包括容器组件和布局等, 更深入的内容会在高级篇中出现想深入学习的朋友们可查阅有关资料或图书, 比如 Java Swing 图形界面开发与案例详解清华大学出版社
早期的 AWT(抽象窗口工具包) 组件开发的图形用户界面, 要依赖本地系统, 当把 AWT 组件开发的应用程序移植到其他平台的系统上运行时, 不能保证其外观风格, 因此 AWT 是依赖于本地系统平台的而使用 Swing 开发的 Java 应用程序, 其界面是不受本地系统平台限制的, 也就是说 Swing 开发的 Java 应用程序移植到其他系统平台上时, 其界面外观是不会改变的但要注意的是, 虽然 Swing 提供的组件可以方便开发 Java 应用程序, 但是 Swing 并不能取代 AWT, 在开发 Swing 程序时通常要借助与 AWT 的一些对象来共同完成应用程序的设计
一常用窗体
Swing 窗体是 Swing 的一个组件, 同时也是创建图形化用户界面的容器, 可以将其它组件放置在窗体容器中
1. JFrame 框架窗体
JFrame 窗体是一个容器, 在 Swing 开发中我们经常要用到, 它是 Swing 程序中各个组件的载体语法格式如下:
JFrame jf = new JFrame(title);
当然, 在开发中更常用的方式是通过继承 java.swing.JFrame 类创建一个窗体, 可通过 this 关键字调用其方法
而在 JFrame 对象创建完成后, 需要调用 getContentPane() 方法将窗体转换为容器, 然后在容器中添加组件或设置布局管理器, 通常这个容器用来包含和显示组件如果需要将组件添加至容器, 可以使用来自 Container 类的 add() 方法进行设置至于 JPanel 容器会在后面提到
下面举一个 JFrame 窗体的例子
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class JFrameDemo {
public void CreateJFrame() {
JFrame jf = new JFrame("这是一个 JFrame 窗体"); // 实例化一个 JFrame 对象
jf.setVisible(true); // 设置窗体可视
jf.setSize(500, 350); // 设置窗体大小
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 设置窗体关闭方式
}
public static void main(String[] args) {
new JFrameDemo().CreateJFrame(); // 调用 CreateJFrame() 方法
}
}
运行结果如下:
这就是一个 500*350 的窗体, 用的是 setSize() 方法; 标题为这是一个 JFrame 窗体, 在实例化对象时就可以定义; 窗体关闭方式见窗体右上角为 EXIT_ON_CLOSE; 窗体可视 setVisible() 方法中的参数为 false 或不写 setVisible() 方法时, 此窗体不可见
常用的窗体关闭方式有四种, 分别为 DO_NOTHING_ON_CLOSEDISPOSE_ON_CLOSEHIDE_ON_CLOSEEXIT_ON_CLOSE 第一种表示什么也不做就将窗体关闭; 第二种表示任何注册监听程序对象后会自动隐藏并释放窗体; 第三种表示隐藏窗口的默认窗口关闭; 第四种表示退出应用程序默认窗口关闭
下面再举一个用继承 JFrame 的方式编写的代码, 并加入 Container 容器及 JLabel 标签 (后面会提到), 来看一下具体的流程
import java.awt.Color;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class JFrameDemo2 extends JFrame {
public void init() {
this.setVisible(true); // 可视化
this.setSize(500, 350); // 大小
this.setTitle("博客园"); // 标题
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 关闭方式
JLabel jl = new JLabel("http://www.cnblogs.com/adamjwh/"); // 创建一个 JLabel 标签
jl.setHorizontalAlignment(SwingConstants.CENTER); // 使标签文字居中
Container container = this.getContentPane(); // 获取一个容器
container.add(jl); // 将标签添加至容器
container.setBackground(Color.YELLOW); // 设置容器背景颜色
}
public static void main(String[] args) {
new JFrameDemo2().init();
}
}
运行结果如下:
这里继承了 JFrame 类, 所以方法中实现时用 this 关键字即可 (或直接实现, 不加 this)12~15 行为创建 JFrame 框体; 1718 行为 JLabel 标签, 用与添加一个标签; 20~22 行为 Container 容器, 用 getContentPane() 方法为 JFrame 窗体获取容器, 并用 add() 方法将 JLabel 标签添加到容器上
2. JDialog 窗体
JDialog 窗体是 Swing 组件中的对话框, 继承了 AWT 组件中的 java.awt.Dialog 类功能是从一个窗体中弹出另一个窗体
下面来看一个实例:
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;
public class JDialogDemo extends JDialog { // 继承 JDialog 类
public JDialogDemo() {
super(new MyJFrame(), "这是一个 JDialog 窗体", true); // 实例化一个 JDialog 类对象, 指定其父窗体窗口标题和类型
Container container = this.getContentPane();
container.add(new JLabel("http://www.cnblogs.com/adamjwh/"));
this.setSize(500, 350);
}
public static void main(String[] args) {
new JDialogDemo();
}
}
// 下面这部分内容包含监听器, 会在后面的内容中介绍
class MyJFrame extends JFrame {
public MyJFrame() {
this.setVisible(true);
this.setSize(700, 500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container container = this.getContentPane();
container.setLayout(null);
JButton jb = new JButton("点击弹出对话框"); // 创建按钮
jb.setBounds(30, 30, 200, 50); // 按钮位置及大小
jb.addActionListener(new ActionListener() { // 监听器, 用于监听点击事件
@Override public void actionPerformed(ActionEvent e) {
new JDialogDemo().setVisible(true);
}
});
container.add(jb);
}
}
运行结果如下:
当我们点击按钮时, 触发点击事件, 这时执行第 42 行的语句, 创建一个 JDialog 的实例化对象, 弹出一个窗口这里出现了许多我们之前学过的知识, 比如 super 关键字, 在之前提到过, 这里相当于使用了 JDialog(Frame f, String title, boolean model) 形式的构造方法; 监听器的实现就是一个匿名内部类, 之前也提到过对于 JButtonJLable 和监听器的内容后面会有所介绍
二标签组件
在 Swing 中显示文本或提示信息的方法是使用标签, 它支持文本字符串和图标上面我们提到的 JLabel 就是这里的内容
1. 标签
标签由 JLabel 类定义, 可以显示一行只读文本一个图像或带图像的文本
JLabel 类提供了许多构造方法, 可查看 API 选择需要的使用, 如显示只有文本的标签只有图标的标签或包含文本与图标的标签等因为上面已经出现过了, 这里就不再举例了常用语法格式如下, 创建的是一个不带图标和文本的 JLabel 对象:
JLabel jl = new JLabel();
2. 图标
Swing 中的图标可以放置在按钮标签等组件上, 用于描述组件的用途图标可以用 Java 支持的图片文件类型进行创建, 也可以使用 java.awt.Graphics 类提供的功能方法来创建
在 Swing 中通过 Icon 接口来创建图标, 可以在创建时给定图标的大小颜色等特性注意, Icon 是接口, 在使用 Icon 接口的时候, 必须实现 Icon 接口的三个方法:
public int getIconHeight()
public int getIconWidth()
public void paintIcon(Component arg0, Graphics arg1, int arg2, int arg3)
前两个方法用于获取图片的长宽, paintIcon() 方法用于实现在指定坐标位置画图
下面看一个用 Icon 接口创建图标的实例:
import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class IconDemo extends JFrame implements Icon {
private int width; // 声明图标的宽
private int height; // 声明图标的长
public IconDemo() {} // 定义无参构造方法
public IconDemo(int width, int height) { // 定义有参构造方法
this.width = width;
this.height = height;
}
@Override
public int getIconHeight() { // 实现 getIconHeight() 方法
return this.height;
}
@Override
public int getIconWidth() { // 实现 getIconWidth() 方法
return this.width;
}
@Override
public void paintIcon(Component arg0, Graphics arg1, int arg2, int arg3) { // 实现 paintIcon() 方法
arg1.fillOval(arg2, arg3, width, height); // 绘制一个圆形
}
public void init() { // 定义一个方法用于实现界面
IconDemo iconDemo = new IconDemo(15, 15); // 定义图标的长和宽
JLabel jb = new JLabel("icon 测试", iconDemo, SwingConstants.CENTER); // 设置标签上的文字在标签正中间
Container container = getContentPane();
container.add(jb);
this.setVisible(true);
this.setSize(500, 350);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new IconDemo().init();
}
}
运行结果如下:
这样如果需要在窗体中使用图标, 就可以用第 39 行的如下代码创建图标:
IconDemo iconDemo = new IconDemo(15, 15);
3. 图片图标
Swing 中的图标除了可以绘制之外, 还可以使用某个特定的图片创建利用 javax.swing.ImageIcon 类根据现有图片创建图标
下面看一个实例, 我们先在包下放一个图片 (注意放置位置, 不同位置路径不同), 如下:
下面是实现的代码:
import java.awt.Container;
import java.net.URL;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class ImageIconDemo extends JFrame {
public ImageIconDemo() {
JLabel jl = new JLabel("这是一个 JFrame 窗体, 旁边是一个图片");
URL url = ImageIconDemo.class.getResource("pencil.jpg"); // 获得图片所在 URL
Icon icon = new ImageIcon(url); // 实例化 Icon 对象
jl.setIcon(icon); // 为标签设置图片
jl.setHorizontalAlignment(SwingConstants.CENTER);
jl.setOpaque(true); // 设置标签为不透明状态
Container container = getContentPane();
container.add(jl);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(500, 350);
}
public static void main(String[] args) {
new ImageIconDemo();
}
}
运行结果如下:
对于图片标签, 我们经常将图片放置在标签上, 用 JLabel 中的 setIcon() 方法即可, 当然也可以在初始化 JLabel 对象时为标签指定图标, 这是需要获取一个 Icon 实例
而第 15 行的 getResource() 方法可以获得资源文件的 URL 路径, 这里的路径是相对于前面的那个类的, 所以可将该图片与该类放在同一个文件夹下; 如果不在同一个文件夹下, 需通过其它方法获取路径
本篇先介绍到这里, 内容比较多所以分篇编写, 下一篇为常用的布局管理器 Jpanel 等内容
来源: https://www.cnblogs.com/adamjwh/p/8392737.html