继续我的上一小节,学习另外一个Java包的使用。 Swing是在原有的AWT的基础上进行了补充和改进。
上节:【GUI】GUI编程;AWT包(界面属性,布局管理,事件监听)
学习文章:Java-Swing编程介绍
文章目录
3 Swing包
Swing是一个为Java设计的GUI工具包。
Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。
Swing提供许多比AWT更好的屏幕显示元素。轻量级组件的缺点则是执行速度较慢,优点就是可以在所有平台上。
Swing gui包含了两种元素:组件和容器。
- 组件(控件):组件是单独的控制元素,例如按键或者文本编辑框。组件要放到容器中才能显示出来。
继承于JComponent类。常见的组件有标签JLabel、按键JButton、输入框JTextField、复选框JCheckBox、列表JList。 - 容器:容器是一种可以包含组件的特殊组件。由于容器也是组件,因此容器也可放到别的容器中。故组件和容器构成了包含层级关系。
Swing中有两大类容器。
(1)重量级容器/顶层容器(top-level container),它们不是继承于JComponent。它们包括JFrame,JApplet,JWindow,JDialog。它们的最大特点是不能被别的容器包含,只能作为界面程序的最顶层容器来包含其它组件。
(2)轻量级容器/中间层容器,它们继承于JComponent,包括JPanel,JScrollPane等。中间层容器用来将若干个相关联的组件放在一起。由于中间层容器继承于JComponent,因此它们本身也是组件,它们必须包含在其它的容器中。
3.1 JFrame窗口
- JFrame窗口与AWT包的Frame不同,也需要获得一个容器来实现堆窗口颜色等设定。
- 默认实现窗口推出监听。
- 方法:
Container container = this.getContentPane();
//获得一个容器
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
//设置标签居中
package study.gui.swing;
import javax.swing.*;
import java.awt.*;
public class JFrameText {
public static void main(String[] args) {
new MyJFrame().init();
}
}
//窗口
class MyJFrame extends JFrame {
public void init(){//一个好的编程习惯,定义一个初始化方法
this.setBounds(100,100,400,300);
this.setVisible(true);
// this.setBackground(Color.black);//不添加容器无法设置颜色
// this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//默认实现窗口推出监听
JLabel jLabel = new JLabel("欢迎使用JFrame!");
this.add(jLabel);
jLabel.setHorizontalAlignment(SwingConstants.CENTER);//设置标签居中
//获得一个容器
Container container = this.getContentPane();
container.setBackground(Color.YELLOW);//设置容器颜色
}
}
3.2 JDialog弹窗
- 用事件去绑定弹窗,例如:按一个按钮触发事件。
- 弹窗需要借助容器。
- 不需要写弹窗推出。
package study.gui.swing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JDialogText {
public static void main(String[] args) {
new MyJFrame2().init();
}
}
//窗口
class MyJFrame2 extends JFrame{
public void init(){
this.setTitle("窗口");
this.setVisible(true);
this.setBounds(10,10,400,300);
//设置容器 存放东西
Container container = this.getContentPane();
container.setBackground(Color.PINK);
//绝对布局
container.setLayout(null);
//创建一个弹窗按钮
JButton jButton = new JButton("进入");
jButton.setBounds(30,30,100,50);
container.add(jButton);
//为按钮绑定监听——弹窗
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new MyDialogDemo();
}
});
}
}
//弹窗
class MyDialogDemo extends JDialog{
public MyDialogDemo() {
this.setTitle("弹窗");
this.setVisible(true);
this.setBounds(100,100,200,200);
Container container = this.getContentPane();
container.setBackground(Color.GREEN);
container.add(new JLabel("Helo"));
}
}
3.3 标签
3.3.1 JLabel标签
JLabel jLabel = new JLabel("xxx");
jLabel.setHorizontalAlignment(SwingConstants.CENTER);//设置标签居中
3.3.2 Icon图标
- Icon是一个接口需要实现类 ,JFrame来继承。
- 方法:
(1)实现类 iconDemo = new 实现类(宽,高);
//图标
(2)JLabel label = new JLabel("point",iconDemo,SwingConstants.CENTER);
//把图标放在标签上 也可以放在按钮上 格式:显示文字+图标名称+位置
package study.gui.swing;
import javax.swing.*;
import java.awt.*;
public class IconText {
public static void main(String[] args) {
new MyIconFrame().init();
}
}
//窗口
class MyIconFrame extends JFrame implements Icon{
int width;
int height;
//构造
public MyIconFrame() throws HeadlessException {
}
public MyIconFrame(int width, int height) {
this.width = width;
this.height = height;
}
public void init(){
MyIconFrame iconDemo = new MyIconFrame(20,20);//图标
//把图标放在标签上 也可以放在按钮上 格式:显示文字+图标名称+位置
JLabel label = new JLabel("point",iconDemo,SwingConstants.CENTER);
Container container = this.getContentPane();
container.add(label);
this.setVisible(true);
this.setBounds(100,100,500,400);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
//必须实现的Icon接口方法
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.drawOval(x,y,width,height);//画个空心圆
}
@Override
public int getIconWidth() {
return this.width;
}
@Override
public int getIconHeight() {
return this.height;
}
}
3.3.3 图片标签
- 不需要继承Icon接口
- 方法:
(1)ImageIcon imageIcon = new ImageIcon("图片地址");
//构造图片标签
(2)label.setIcon(imageIcon);
//把图标放在标签上
package study.gui.swing;
import javax.swing.*;
import java.awt.*;
public class ImageText extends JFrame {
public ImageText() {
JLabel label = new JLabel("这是一个图片标签");
//获取图片的地址
ImageIcon imageIcon = new ImageIcon("G:\\Java\\JavaSE\\JavaText\\src\\study\\gui\\swing\\1.jpg");
label.setIcon(imageIcon);
label.setHorizontalAlignment(SwingConstants.CENTER);
Container container = this.getContentPane();
container.add(label);
setVisible(true);
setBounds(100,100,700,600);
}
public static void main(String[] args) {
new ImageText();
}
}
3.4 JPanel与JScrollPane面板
两种面板形式:
- 普通面板:
JPanel panel = new JPanel(new GridLayout(1,3));
- 可以滚动的面板:
JScrollPane scrollPane = new JScrollPane(textArea);
package study.gui.swing;
import javax.swing.*;
import java.awt.*;
public class JPanelDemo extends JFrame {
public JPanelDemo() {
Container container = this.getContentPane();
container.setLayout(new GridLayout(2,1,10,10));//后面的参数表示面板之间的间距
//面板
JPanel panel = new JPanel(new GridLayout(1,3));
panel.add(new JButton("1"));
panel.add(new JButton("2"));
panel.add(new JButton("3"));
container.add(panel);
//可以滚动的面板
//文本域
JTextArea textArea = new JTextArea(30,50);//参数表示行列
textArea.setText("If you set your goals ridiculously high and it's a failure, you will fail above everyone else's success.");
//Scroll面板
JScrollPane scrollPane = new JScrollPane(textArea);
container.add(scrollPane);
this.setVisible(true);
this.setBounds(100,100,500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JPanelDemo();
}
}
3.6 按钮【图片、单选、复选】
三种按钮形式:
- 普通按钮
new JButton()
:可以添加图片等。 - 单选按钮
new JRadioButton();
:放在一个组new ButtonGroup()
里面只能选一个。 - 复选按钮
new JCheckBox();
:放在一个盒子里面可以选多个。
package study.gui.swing;
import javax.swing.*;
import java.awt.*;
public class ButtonText extends JFrame {
public ButtonText() {
Container container = this.getContentPane();
container.setLayout(new GridLayout(1,3,10,10));//后面的参数表示面板之间的间距
//面板1:显示图片按钮
JPanel panel1 = new JPanel(new GridLayout(1,1));
//把图片添加到按钮
Icon imageIcon = new ImageIcon("G:\\Java\\JavaSE\\JavaText\\src\\study\\gui\\swing\\1.jpg");
JButton button1 = new JButton();
button1.setIcon(imageIcon);
button1.setToolTipText("图片按钮");//悬浮提示
panel1.add(button1);
container.add(panel1);
//面板2:显示单选按钮
JPanel panel2 = new JPanel(new GridLayout(3,1));
//单选框
JRadioButton radioButton1 = new JRadioButton("GUCCI");
JRadioButton radioButton2 = new JRadioButton("LV");
JRadioButton radioButton3 = new JRadioButton("CHANEL");
//单选框进行分组才能在选择时是单项选择:分组之后,一组之中只能选一个
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(radioButton1);
buttonGroup.add(radioButton2);
buttonGroup.add(radioButton3);
//添加
panel2.add(radioButton1,BorderLayout.CENTER);
panel2.add(radioButton2,BorderLayout.SOUTH);
panel2.add(radioButton3,BorderLayout.NORTH);
container.add(panel2);
//面板3:显示复选按钮
JPanel panel3 = new JPanel(new GridLayout(3,1));
//多选框
JCheckBox checkBox1 = new JCheckBox("Java");
JCheckBox checkBox2 = new JCheckBox("Python");
JCheckBox checkBox3 = new JCheckBox("C");
panel3.add(checkBox1,BorderLayout.CENTER);
panel3.add(checkBox2,BorderLayout.NORTH);
panel3.add(checkBox3,BorderLayout.SOUTH);
container.add(panel3);
this.setVisible(true);
this.setTitle("按钮");
this.setBounds(100,100,500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new ButtonText();
}
}
3.7 列表【下拉框、列表框】
两种列表的应用:
- 下拉框
new JComboBox<>()
:用于选择地区,或者一些单个选择。 - 列表框
new JList<>(列表参数)
:用于展示信息,一般是动态扩容。
package study.gui.combobox;
import javax.swing.*;
import java.awt.*;
//文本框测试
public class boxText extends JFrame {
public boxText() {
Container cp = this.getContentPane();
cp.setLayout(new GridLayout(1,2));
//下拉框
JComboBox<String> comboBox = new JComboBox<>();
comboBox.addItem("Java");
comboBox.addItem("Python");
comboBox.addItem("GO");
comboBox.setToolTipText("选择一门最好的语言");
cp.add(comboBox);
//列表框
String[] content = {"学习","工作","娱乐"};
JList<String> list = new JList<>(content);
cp.add(list);
this.setVisible(true);
this.setSize(600,400);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new boxText();
}
}
3.8 文本框【文本框、密码框、文本域】
三种可以接受输入的文本框:
- 文本框:编辑一行数据。
- 密码框:用符号覆盖了输入内容。
- 文本域:可以编辑多行文字。
package study.gui.combobox;
import javax.swing.*;
import java.awt.*;
public class TextText extends JFrame {
public TextText() throws HeadlessException {
Container container = this.getContentPane();
this.setLayout(new GridLayout(3,1));
//文本框
JTextField textField = new JTextField("hello");
container.add(textField);
//密码框
JPasswordField passwordField = new JPasswordField();//默认(黑点)
passwordField.setEchoChar('¥');//设置密码不可见
container.add(passwordField);
//文本域,通常和Scroll滚动面板一起使用面板
JTextArea textArea = new JTextArea(10,40);
textArea.setText("欢迎光临");
JScrollPane scrollPane = new JScrollPane(textArea);
container.add(scrollPane);
this.setVisible(true);
this.setSize(600,400);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TextText();
}
}