Swing - 简单入门

1. 概念

GUI( 图形用户界面 ) — [ Swing ]跨平台,并且保持风格统一
轻量级的组件

2. 类继承图

JComponent组件 可添加到 Window窗口 中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8QMhS9qo-1575276506911)(en-resource://database/11047:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kBMeTovm-1575276506918)(en-resource://database/11045:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1SQDEBbV-1575276506923)(en-resource://database/11049:1)]

3. 代码示例

窗体JFrame关闭的常数形式
EXIT_ON_CLOSE:关闭程序、窗体
HIDE_ON_CLOSE:窗口关闭并隐藏,程序未关闭:默认
DO_NOTHING_ON_CLOSE:无任何操作

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 窗体内组件刷新 – 解决增加的组件没在窗体显示
刷新
方法1:JFrame.setContentPane( Container )
方法2:container.validate()


  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 模态对话框、按钮点击事件处理

模态对话框:不关闭模态框,其他窗体不可被点击

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K6wm0QIj-1575276506928)(en-resource://database/11051:1)]

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

FLowLayout方法
setAlignment( int ) -- 元素对齐方式
setHgap( int ) -- 容器内元素之间的左外边距
setVgap( int ) -- 容器内元素之间的上外边距
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);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMwl4VBf-1575276506931)(en-resource://database/11053:1)]

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);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ry3UICUE-1575276506934)(en-resource://database/11055:1)]

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);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R1cSWrht-1575276506938)(en-resource://database/11057:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nAJD6FJ4-1575276506942)(en-resource://database/11059:1)]

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);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fYSHWTXm-1575276506945)(en-resource://database/11061:1)]

3.6 监听器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uRFS3agr-1575276506948)(en-resource://database/11063:1)]

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 表格数据的添加

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gqr8STFM-1575276506951)(en-resource://database/11067:0)]

  表格单行数据添加

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();
  • 0
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值