文章目录
1. 概念
GUI( 图形用户界面 ) — [ Swing ]跨平台,并且保持风格统一
轻量级的组件
2. 类继承图
JComponent组件 可添加到 Window窗口 中
3. 代码示例
3.1 主窗体居中显示
public testFrame extends JFrame {
testFrame( int width, int height ){
f.setSize(200, 200); // 窗体大小
double screenHeight = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
double screenWidth = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
int y = (int)((screenHeight-height)/2);
int x = (int)((screenWidth-Width)/2);
f.setLocation(x, y); // 窗体左上顶点在屏幕的位置 -- 居中显示
f.setVisible(true) // 窗体是否可视化
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ) // 点击窗体关闭按钮,程序结束
}
}
3.2 窗体内组件刷新 – 解决增加的组件没在窗体显示
main线程休眠 – JFrame并没有添加JLabel标签
JFrame window = new JFrame();
window.setSize( 200, 200 );
Thread.sleep(1000);
window.add( new JLabel("新添加组件");
添加刷新代码 - JLabel添加到窗口里面了
JFrame window = new JFrame();
window.setSize( 200, 200 );
Thread.sleep(1000);
window.add( new JLabel("新添加组件");
window.validate( window.getContentePane() ) // 方法1
//window.getContentPane().validate() // 方法2
3.3 模态对话框、按钮点击事件处理
模态对话框:不关闭模态框,其他窗体不可被点击
public static void main(String[] args) throws UnsupportedEncodingException, InterruptedException {
JFrame f = new TestString();
f.setSize(200,200);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
JButton btn = new JButton("模态对话框");
f.add(btn);
// 按钮点击处理函数
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 创建模态框( 参数:父窗体、对话框标题、是否是模态框 )
JDialog dialog = new JDialog(f, "对话框", true);
dialog.setSize(100,100);
dialog.setVisible(true);
}
});
}
3.4 JLabel
3.4.1 带图片以及文本显示
JFrame f = new JFrame();
// 1. 设置JFrame窗体为全屏显示
double screenHeight = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
double screenWidth = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
f.setSize((int)screenWidth, (int)screenHeight);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 2.获取图片资源 -- 相对项目下的相对路径
Icon icon = new ImageIcon("src/1.png");
JLabel label = new JLabel("文本", icon, JLabel.LEFT);
f.add(label);
// 1.如果不刷新(多写一条代码的话),切记这条语句放置在最后执行
f.setVisible(true);
3.4.2 修改JLabel图片的大小
ImageIcon icon = new ImageIcon( " 图片路径");
Image changIcon = icon.getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT);
JLabel label = new JLabel( "文本", changIcon, JLabel.LEFT )
3.5 布局
3.5.1 绝对定位 - null
组件位置、大小固定 – 不指定这些属性,则在容器内不会显示
JFrame j = new JFrame();
j.setSize(500,500);
// 容器内元素绝对定位布局
j.setLayout(null);
JButton btn = new JButton("点击");
// 如果取消小列两行两句,则在窗体中看不见元素
btn.setLocation(50,50);
btn.setSize(60,60);
j.add( btn );
3.5.2 流式布局 - FlowLayout - 窗体默认布局
很像前端的行内元素,一行显示不全,则换行显示
默认 元素在容器居中显示 – FlowLayout.CENTER
JFrame j = new JFrame();
j.setSize(100,400);
// JFrame容器内元素 流式布局
j.setLayout(new FlowLayout());
// 添加十个按钮
for(int i = 0; i < 10; i++) {
j.add(new JButton(i + ""));
}
j.setVisible(true);
3.5.3 边界布局 - BorderLayout
1. 分成5个区域:north、south、west、east、center
2. 一个区域只能放一个组件、后者覆盖前者
JFrame j = new JFrame();
j.setSize(300, 300);
j.setLayout(new BorderLayout());
j.add(new JButton(1 + ""), BorderLayout.NORTH);
j.add(new JButton("覆盖1"), BorderLayout.NORTH);
j.add(new JButton(2 + ""), BorderLayout.SOUTH);
j.add(new JButton(3 + ""), BorderLayout.WEST);
j.add(new JButton(4 + ""), BorderLayout.EAST);
j.add(new JButton(5 + ""), BorderLayout.CENTER);
j.setVisible(true);
3.5.4 网格布局 - GridLayout
设定整个窗口的最多行、列 – 容器内元素的宽高自适应
程序尽可能的填满整个屏幕
JFrame j = new JFrame();
j.setSize(300, 300);
// 网格布局
Container c = j.getContentPane();
c.setLayout(new GridLayout(4,4,10,20));
// 添加元素
for(int i = 0; i< 20; i++) {
c.add(new JButton(i + ""));
}
/* -- 只添加5个元素,则如下面第二张图
for(int i = 0; i < 5; i++) {
c.add(new JButton(i + ""));
}*/
j.setVisible(true);
3.5.5 卡片布局 - CardLayout
// 1. 设置JFrame内的元素未 边界布局
JFrame j = new JFrame();
j.setSize(500, 500);
j.setLayout(new BorderLayout());
// 2. 将center位置的panel 添加两张卡片 card1、card2
CardLayout cardLayout = new CardLayout();
JPanel panel = new JPanel();
panel.setBackground(Color.CYAN);
JPanel card1 = new JPanel();
card1.setBackground(Color.red);
JPanel card2 = new JPanel();
card2.setBackground(Color.green);
panel.setLayout(cardLayout);
panel.add(card1, "card1");
panel.add(card2, "card2");
// 3. 将wedt位置的panel2 添加两个按钮,并且定义他们的点击事件
JPanel panel2 = new JPanel();
panel2.setBackground(Color.blue);
JButton btn1 = new JButton("卡片1");
JButton btn2 = new JButton("卡片2");
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//cardLayout.show(panel, "card1");
cardLayout.first(panel);
}
});
btn2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//cardLayout.show(panel, "card2");
cardLayout.last(panel);
}
});
panel2.add(btn1);
panel2.add(btn2);
j.add(panel, BorderLayout.CENTER);
j.add(panel2, BorderLayout.WEST);
j.setVisible(true);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
3.6 监听器
3.6.1 鼠标点击监听器
// 设置 JFrame 为 绝对定位布局
JFrame j = new JFrame();
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
j.setLayout(null);
j.setSize(500, 500);
// 初始化jList列表框,并把其放入到 带滚动条的面板上
String[] stus = {"学生1","学生2","学生3","学生4","学生5","学生5","学生5","学生5"};
JList<String> list = new JList<String>(stus);
JScrollPane js = new JScrollPane(list);
js.setBounds(10,10,100,100);
// 添加按钮的 点击事件处理
JButton btn = new JButton("打印选中的元素");
btn.setBounds(10,120, 200,50);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(list.getSelectedValuesList());
}
});
j.add(js);
j.getContentPane().add(btn);
j.setVisible(true);
3.6.2 焦点监听器
public class JFrame2 extends JFrame {
JTextField input = new JTextField();
JTextField input2 = new JTextField();
class MyListener implements FocusListener {
@Override
public void focusGained(FocusEvent e) {
Object o =e.getSource();
if(o == input) {
System.out.println("input失去焦点");
}else if( o == input2 ){
System.out.println("iput2失去焦点");
}
}
@Override
public void focusLost(FocusEvent e) {
Object o =e.getSource();
if(o == input) {
System.out.println("input获取焦点");
}else if( o == input2 ){
System.out.println("iput2获取焦点");
}
}
}
JFrame2() {
JFrame j = new JFrame();
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
j.setLayout(new FlowLayout());
j.setSize(250, 250);
input.setColumns(20);
input2.setColumns(20);
FocusListener list = new MyListener();
input.addFocusListener(list);
input2.addFocusListener(list);
j.add(input);
j.add(input2);
j.setVisible(true);
}
}
// 测试
new JFrame2();
3.6 JTable - 表格
3.6.1 表格数据的添加
表格单行数据添加
JTable table = new JTable();
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
Vector v = new Vector()
// 单行数据 --- 故每添加一行数据需要不断的清空v的内容
tableModel.add( v )
3.6.2 表格数据清空
JTable table = new JTable();
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
tableModel.setRowCount(0)
3.6.3 删除选中行的数据
JTable table = new JTable();
DefaultTableModel model = (DefaultTableModel) table.getModel();
Integer selectedRow = table.getSelectedRow();
model.removeRow(selectedRow);
3.7 JComboBox - 下拉列表框
3.7.1 列表框数据的添加
JComboBox jcb = new JComboBox();
// 单条记录的添加
jcb.addItem( Object o )
3.7.2 获取选中的列表框数据
JComboBox<String> jcb = new JComboBox<String>();
String str = typeNameBox.getSelectedItem();