一、Swing框架
Swing框架是Java Swing的核心,它提供了许多基本组件和高级控件,例如按钮,文本框,复选框,单选框,滚动窗格等等。Swing框架的特点是使用Java 2D API来呈现所有组件,从而产生高度可定制化的用户界面。我们可以通过生成基于Swing组件的GUI控件,来实现独特的外观和行为。如下面的代码:
import javax.swing.*; import java.awt.*; public class MyFrame extends JFrame { public MyFrame() { setTitle("Swing框架示例"); setSize(300, 200); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new MyFrame(); } }
代码解释:
- 我们创建了一个继承自JFrame类的自定义MyFrame类;
- 在MyFrame类的构造函数中,我们调用了setTitle()方法来设置窗口的标题,setSize()方法来设置窗口的大小,setLocationRelativeTo()方法来将窗口定位到屏幕中央,setDefaultCloseOperation()方法来设置窗口的关闭操作,默认为DO_NOTHING_ON_CLOSE,我们设置为EXIT_ON_CLOSE表示用户单击关闭按钮时关闭窗口并终止Java虚拟机进程;
- 最后,我们通过调用setVisible()方法使窗口可见(默认为不可见),这样用户就可以看到这个窗口了。
二、布局管理器
在Swing框架中使用了布局管理器来控制窗体上的组件的大小和位置。布局管理器负责确定每个组件在窗体上的位置和大小,因此,我们不需要手动管理每个组件的位置和大小。Swing提供了多种布局管理器,如BorderLayout、FlowLayout、GridLayout、Boxlayout、GridBagLayout等。接下来我们将详细介绍FlowLayout和BorderLayout的使用。
FlowLayout
FlowLayout是Java Swing当中最简单的布局管理器之一,其默认设置为左对齐,并且在水平和垂直方向上都会添加一些空白间距来实现布局。FlowLayout对于那些不需要特殊定位和大小的组件非常有效。下面的代码演示了如何使用FlowLayout:
import javax.swing.*; import java.awt.*; public class FlowLayoutDemo { public static void main(String[] args) { JFrame frame = new JFrame("FlowLayout示例"); frame.setSize(300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new FlowLayout()); frame.add(new JButton("按钮1")); frame.add(new JButton("按钮2")); frame.add(new JButton("按钮3")); frame.add(new JButton("按钮4")); frame.add(new JButton("按钮5")); frame.setVisible(true); } }
代码解释:
- 我们在main方法里面创建了一个JFrame对象,并设置了该JFrame的标题和大小;
- 接着我们设置了该JFrame的布局管理器为FlowLayout,FlowLayout默认是左对齐的;
- 我们添加了五个按钮,由于FlowLayout对象默认水平和垂直都会添加空白间距,因此最终的效果是这五个按钮呈水平排列,并且水平和垂直方向都有空白间距。
BorderLayout
BorderLayout也是一种常用的布局管理器,它分为五个区域,分别是NORTH、SOUTH、WEST、EAST和CENTER。每个区域只能放置一个组件。下面的代码演示了如何使用BorderLayout:
import javax.swing.*; import java.awt.*; public class BorderLayoutDemo { public static void main(String[] args) { JFrame frame = new JFrame("BorderLayout示例"); frame.setSize(500, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new JButton("北部按钮"), BorderLayout.NORTH); frame.add(new JButton("西部按钮"), BorderLayout.WEST); frame.add(new JButton("东部按钮"), BorderLayout.EAST); frame.add(new JButton("南部按钮"), BorderLayout.SOUTH); frame.add(new JButton("中部按钮"), BorderLayout.CENTER); frame.setVisible(true); } }
代码解释:
- 我们在main方法里面创建了一个JFrame对象,并设置了该JFrame的标题和大小;
- 接着我们设置了该JFrame的布局管理器为BorderLayout;
- 我们通过调用add()方法添加了五个按钮,每个按钮在不同的方位,并且最后一个按钮位于中央。
三、事件处理
在Java Swing中,事件处理是非常重要的一部分。Swing中的事件可以分为两类:触发事件和监听事件。当用户执行某些动作时,比如单击按钮、选择菜单项或者拖动滑块等,触发事件就会被发生。我们需要使用监听事件来响应所发生的事件。通过实现Java Swing中相应的监听类,我们可以获取到用户的输入和操作,然后根据这些输入实现相应的操作。
我们来看下面这个简单的例子:
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ActionListenerDemo { public static void main(String[] args) { JFrame frame = new JFrame("ActionListener示例"); JButton button = new JButton("单击我"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, "您单击了按钮!"); } }); frame.add(button, BorderLayout.CENTER); frame.setSize(300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
代码解释:
- 我们在main方法里面创建了一个JFrame对象,并创建一个JButton对象;
- 接着我们添加一个ActionListener监听器对象,这个监听器对象会监听用户对按钮进行的单击操作;
- 当我们单击按钮时,ActionListener对象会响应该事件,弹出一个对话框。
四、绘图和动画
除了上述内容,Java Swing还提供了绘图和动画的功能。Java Swing可以使用Java 2D API进行绘图,可以使用Swing Timer特性实现图形动画效果。我们可以将这些功能用于创建游戏、动态图形和其他视觉效果。
下面是一个简单的例子,演示了如何使用Java 2D API绘制一个简单的图形和使用Swing Timer实现动画效果:
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; public class PaintDemo { public static void main(String[] args) { JFrame frame = new JFrame("Paint示例"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 400); frame.add(new MyCanvas()); frame.setVisible(true); } } class MyCanvas extends JComponent implements ActionListener { private int x = 10; private int y = 10; private int directionX = 1; private int directionY = 1; private Timer timer; private int width = 50; private int height = 50; public MyCanvas() { timer = new Timer(5, this); timer.start(); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Rectangle2D rect = new Rectangle2D.Double(x, y, width, height); g2.setColor(Color.RED); g2.fill(rect); } public void actionPerformed(ActionEvent e) { if (x < 0 || x > getWidth() - width) { directionX = -directionX; } if (y < 0 || y > getHeight() - height) { directionY = -directionY; } x += directionX; y += directionY; repaint(); } }
代码解释:
- 我们创建了一个JFrame对象,并在其中添加一个MyCanvas对象,MyCanvas对象继承自JComponent,并实现了ActionListener接口;
- 我们使用Java 2D API绘制了一个红色的矩形,矩形的位置和大小由MyCanvas对象的x、y、width和height属性控制;
- 我们使用Swing Timer特性来定期调用MyCanvas对象的actionPerformed()方法,该方法可以修改矩形的位置和运动方向,然后调用repaint()方法重新绘制整个画布。
五、总结
本篇文章介绍了Java Swing框架,它是一个跨平台的GUI工具包,提供了丰富的组件和高级控件,可用于创建富有表现力的应用程序。我们还介绍了Swing中的布局管理器、事件处理、绘图和动画功能。如果您想了解更多关于Java Swing的内容,可以查看官方文档和教程。