【Java Swing】Java组件及事件处理

news2024/12/29 10:41:23

图形用户接口

    • 1、Swing概述
    • 2、Swing顶级容器
    • 3、布局管理器
    • 4、事件处理
    • 5、Swing常用组件

1、Swing概述

  • Swing是一种轻量级的组件,它由Java语言开发,可以通过使用简洁的代码、灵活的功能和模块化的组件来创建优雅的用户界面
  • Swing组建的继承关系
    在这里插入图片描述

2、Swing顶级容器

JFrame

  • JFrame是Swing最常见的一个组件,它是一个独立存在的顶级容器(也叫窗口),所以它不能放在其他的容器之中
import javax.swing.*;

public class JFrameTest {
   public static void showJrame() {
       //创建并且设置顶级窗口
       JFrame frame = new JFrame("JFrameTest");
       //设置关闭窗口的默认操作
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       //设置窗口的大小
       frame.setSize(500,400);
       //展示窗口
       frame.setVisible(true);
   }

   public static void main(String[] args) {
       //调用窗口程序
       SwingUtilities.invokeLater(JFrameTest::showJrame);
   }
}

JDialog

  • JDialog是Swing的另外一个顶级容器,通常用来表示对话框窗口,并且JDialog对话框可分为两种:模态对话框和非模态对话框,对话框是模态或者非模态,可以在创建JDialog对象时为构造方法传入参数来设置,也可以在创建JDialog对象后调用它的setModal()方法来进行设置。
  • 常见的构造方法

在这里插入图片描述

import javax.swing.*;

public class JDialogTest {
    public static void showJDialog(){
        //创建一个JFrame串口
        JFrame frame = new JFrame("JFrame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(500,400);
        //设置JFrame居中对齐
        frame.setLocationRelativeTo(null);
        //创建一个属于frame的模态的JDialog窗口
        JDialog dialog = new JDialog(frame,true);
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.setSize(300,200);
        dialog.setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(JDialogTest::showJDialog);
    }
}

3、布局管理器

BorderLayout

  • BorderLayout(边界布局管理器)是一种较为复杂的布局方式,它将容器划分为五个区域,分别是页头(PAGE_START)、页尾(PAGE_END)、行首(LINE_START)、行尾(LINE_END)、中部(CENTER)。组件可以被放置在这五个区域中的任意一个位置。
import javax.swing.*;
import java.awt.*;

public class BorderLayoutTest {
   public static void showBorderLayout() {
       //创建一个名为BorderLayout的顶级窗口
       JFrame frame = new JFrame("BorderLayout");
       //设置其布局管理器为BorderLayout
       frame.setLayout(new BorderLayout());
       frame.setSize(500, 300);
       frame.setLocationRelativeTo(null);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setVisible(true);
       //创建按钮组件放到BorderLayout的五个地方上
       frame.add(new JButton("按钮1"), BorderLayout.PAGE_START);
       frame.add(new JButton("按钮2"), BorderLayout.PAGE_END);
       frame.add(new JButton("按钮3"), BorderLayout.LINE_START);
       frame.add(new JButton("按钮4"), BorderLayout.CENTER);
       frame.add(new JButton("按钮5"), BorderLayout.LINE_END);
   }

   public static void main(String[] args) {
       SwingUtilities.invokeLater(BorderLayoutTest::showBorderLayout);
   }
}
  • 效果图
    在这里插入图片描述

FlowLayout(流式布局管理器)

  • 是最简单的布局管理器,在这种布局下,容器会将组件按照添加顺序从左向右放置,当到达容器的边界时,会自动将组件放到下一行的开始位置。这些组件可以按左对齐、居中对齐(默认方式)或右对齐的方式排列。
  • FlowLayout的构造方法
    在这里插入图片描述
import javax.swing.*;
import java.awt.*;

public class FlowLayoutTest {
   public static void showFlowLayout(){
       //定义一个名为FlowLayout的顶级窗口
       JFrame frame = new JFrame("FlowLayout");
       //设置布局管理器为FlowLayout,且对齐方式为左对齐,水平间距为20,垂直间距为30
       frame.setLayout(new FlowLayout(FlowLayout.LEFT,20,30));
       frame.setVisible(true);
       frame.setLocationRelativeTo(null);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setSize(500,400);
       //向容器添加组件
       for (int i = 0;i<5;i++){
           frame.add(new JButton("添加第"+(i+1)+"个按钮"));
       }
   }
   public static void main(String[] args) {
       SwingUtilities.invokeLater(FlowLayoutTest::showFlowLayout);
   }
}
  • 效果图
    在这里插入图片描述

GridLayout

  • GridLayout(网格布局管理器)使用纵横线将容器分成n行m列大小相等的网格,每个网格中可以添加一个组件。
    添加到容器中的组件会从左向右、从上向下依次填充到网格中。
    与FlowLayout不同的是,放置在GridLayout布局管理器中的组件将自动占据网格的整个区域
  • 常见的构造方法
    在这里插入图片描述
import javax.swing.*;
import java.awt.*;

public class GridLayoutTest {
    public static void showGridLayout(){
        //创建一个名为GridLayout的·1顶级窗口
        JFrame frame = new JFrame("GridLayout");
        //设置布局管理器为三行三列的GridLayout
        frame.setLayout(new GridLayout(3,3));
        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        for (int i = 0;i<9;i++){
            frame.add(new JButton("添加第"+(i+1)+"个按钮"));
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(GridLayoutTest::showGridLayout);
    }
}
  • 效果图
    在这里插入图片描述

4、事件处理

窗体事件

import javax.swing.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class windowEventTest {
    public static void showWindowEventTest(){
        JFrame frame = new JFrame("Window");
        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        //使用内部类实例化监听器
        frame.addWindowListener(new WindowListener() {
            @Override
            public void windowOpened(WindowEvent e) {
                System.out.println("window opened--->窗体打开");
            }

            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("window closing--->窗体正在关闭");
            }

            @Override
            public void windowClosed(WindowEvent e) {
                System.out.println("window closed--->窗体关闭");

            }

            @Override
            public void windowIconified(WindowEvent e) {
            System.out.println("window Iconified--->窗体图标化事件");
            }

            @Override
            public void windowDeiconified(WindowEvent e) {
                System.out.println("window Deiconified--->窗体取消图标化");
            }

            @Override
            public void windowActivated(WindowEvent e) {
                System.out.println("window Activated--->窗体激活");
            }

            @Override
            public void windowDeactivated(WindowEvent e) {
                System.out.println("window DeActivated--->窗体停用");
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(windowEventTest::showWindowEventTest);
    }
}
  • 效果图
    在这里插入图片描述

鼠标事件

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class MouseEventTest {
   public static void showMouseEventTest(){
       JFrame frame = new JFrame("MouseEvent");
       frame.setSize(500, 300);
       frame.setLocationRelativeTo(null);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setVisible(true);
       JButton button = new JButton("按钮");
       frame.add(button, BorderLayout.CENTER);
       button.addMouseListener(new MouseListener() {
           @Override
           public void mouseClicked(MouseEvent e) {
               if (e.getButton()==MouseEvent.BUTTON1){
                   System.out.println("鼠标左击事件");
               }
               if (e.getButton()==MouseEvent.BUTTON2){
                   System.out.println("鼠标中击事件");
               }
               if (e.getButton()==MouseEvent.BUTTON3){
                   System.out.println("鼠标右击事件");
               }
           }

           @Override
           public void mousePressed(MouseEvent e) {
               System.out.println("鼠标按下事件");
           }

           @Override
           public void mouseReleased(MouseEvent e) {
               System.out.println("鼠标放开事件");
           }

           @Override
           public void mouseEntered(MouseEvent e) {
               System.out.println("鼠标进入事件");
           }

           @Override
           public void mouseExited(MouseEvent e) {
               System.out.println("鼠标离开事件");
           }
       });
   }

   public static void main(String[] args) {
       SwingUtilities.invokeLater(MouseEventTest::showMouseEventTest);
   }
}

键盘事件

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class keyEventTest {
    public static void showKeyEvent(){
        JFrame frame = new JFrame("keyEvent");
        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setLayout(new FlowLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        //添加单行文本框
        JTextField textField = new JTextField(30);
        frame.add(textField);
        textField.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                //获取对应的键盘字符
                char keychar = e.getKeyChar();
                //获取对象的键盘字符代码
                int keyCode = e.getKeyCode();
                System.out.println("键盘按下的字符为:"+keychar);
                System.out.println("键盘按下的字符的字符代码为:"+keyCode);
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(keyEventTest::showKeyEvent);
    }
}

  • 效果图
    在这里插入图片描述

5、Swing常用组件

面板组件

  • JPanel:JPanel面板组件是一个无边框,不能被移动、放大、缩小或者关闭的面板,它的默认布局管理器是FlowLayout。

  • JScrollPane

  • JScrollPane是一个带有滚动条的面板容器,且只能添加一个组件;
    想向JScrollPane面板中添加多个组件,应先将这多个组件添加到某个组件中,然后再将这个组件添加到JScrollPane中
    \

  • 常用的构造方法
    在这里插入图片描述

  • 设置面板滚动策略的方法
    在这里插入图片描述

  • 面板滚动策略
    在这里插入图片描述

import javax.swing.*;

public class ScrollPaneTest {
    public static void showScrollPane(){
        JFrame frame = new JFrame("ScrollPane");
        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        //创建ScrollPane组件
        JScrollPane scrollPane = new JScrollPane();
        //设置水平方向在需要时显示
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        //设置垂直方向上一直显示
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        //定义一个JPanel组件
        JPanel panel = new JPanel();
        //在组件Panel中添加四个按钮
        panel.add(new JButton("按钮1"));
        panel.add(new JButton("按钮2"));
        panel.add(new JButton("按钮3"));
        panel.add(new JButton("按钮4"));
        //将组件Panel加到ScrollPanel中
        scrollPane.setViewportView(panel);
        frame.add(scrollPane);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(ScrollPaneTest::showScrollPane);
    }
}
  • 效果图
    在这里插入图片描述

文本组件

  • JTextField:JTextField称为文本框,它只能接收单行文本的输入
    在这里插入图片描述
import javax.swing.*;
import java.awt.*;

public class JTextFieldTest {
    public static void showTextField(){
        JFrame frame = new JFrame("TextField");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500,500);
        frame.setVisible(true);
        frame.setLocation(300,200);
        JTextArea textArea = new JTextArea(12,34);
        JScrollPane scrollPane = new JScrollPane(textArea);
        textArea.setEditable(false);
        JTextField textField = new JTextField(20);
        JButton button = new JButton("发送");
        button.addActionListener(d -> {
            String context = textField.getText();
            if (context != null && !context.trim().equals("")){
                System.out.println("你输入:"+context+"\n");
            }else{
                System.out.println("不能输入空数据");
            }
            textArea.append("你输入:"+context+"\n");
            textField.setText("");
        });
        JPanel panel = new JPanel();
        JLabel label = new JLabel("聊天信息");
        panel.add(label);
        panel.add(textField);
        panel.add(button);
        frame.add(scrollPane, BorderLayout.PAGE_START);
        frame.add(panel,BorderLayout.PAGE_END);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(JTextFieldTest::showTextField);
    }
}
  • 效果图
    在这里插入图片描述

JTextArea:JTextArea称为文本域,它能接收多行文本的输入,使用JTextArea构造方法创建对象时可以设定区域的行数、列数在这里插入图片描述


标签组件

  • 标签组件主要用到的是JLabel,JLabel组件可以显示文本、图像,还可以设置标签内容的垂直和水平对齐方式
  • 构造方法
    在这里插入图片描述
import javax.swing.*;
import java.awt.*;

public class IconTest {
    public static void showIcon(){
        JFrame frame = new JFrame("Icon");
        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        //创建一个JLabel来存储图片
        JLabel label = new JLabel();
        //创建一个图片组件加到Panel中
        ImageIcon imageIcon = new ImageIcon("tiger.jpg");
        Image image = imageIcon.getImage();
        imageIcon.setImage(image);
        label.setIcon(imageIcon);
        frame.add(label);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(IconTest::showIcon);
    }
}

  • 效果图
    在这里插入图片描述

按钮组件

  • JCheckBox:JCheckBox组件被称为复选框组件,它有选中和未选中两种状态,通常复选框会有多个,用户可以选中其中一个或者多个
  • CheckBox常用的构造方法
    在这里插入图片描述
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CheckBoxTest {
    public static void showCheckBox(){
        JFrame frame = new JFrame("CheckBox");
        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        JLabel label = new JLabel("HELLO WORLD",JLabel.CENTER);
        label.setFont(new Font("宋体",Font.PLAIN,20));
        JPanel panel = new JPanel();
        JCheckBox checkBox1 = new JCheckBox("男");
        JCheckBox checkBox2 = new JCheckBox("女");
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int border = 0;
                if (checkBox1.isSelected())
                    border += Font.BOLD;
                if (checkBox2.isSelected())
                    border+=Font.ITALIC;
                label.setFont(new Font("宋体",border,20));
            }
        };
        checkBox1.addActionListener(listener);
        checkBox2.addActionListener(listener);
        panel.add(checkBox1);
        panel.add(checkBox2);
        frame.add(label);
        frame.add(panel,BorderLayout.PAGE_END);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(CheckBoxTest::showCheckBox);
    }
}

  • 效果图
    在这里插入图片描述

JRadionButton:JRadioButton组件被称为单选按钮组件,单选按钮只能选中一个

  • 常用的构造方法
    在这里插入图片描述
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class RadionButtonTest {
    public static void showRadionButton(){
        JFrame frame = new JFrame("RadionButton");
        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        JLabel label = new JLabel("HELLO WORLD", JLabel.CENTER);
        label.setFont(new Font("宋体", Font.PLAIN, 30));
        JPanel panel = new JPanel();
        ButtonGroup buttonGroup = new ButtonGroup();
        JRadioButton radioButton1 = new JRadioButton("1");
        JRadioButton radioButton2 = new JRadioButton("2");
        buttonGroup.add(radioButton1);
        buttonGroup.add(radioButton2);
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int border = 0;
                if (radioButton1.isSelected())
                    border+=Font.BOLD;
                if (radioButton2.isSelected())
                    border+=Font.ITALIC;
                label.setFont(new Font("宋体",border,30));
            }
        };
        radioButton1.addActionListener(listener);
        radioButton2.addActionListener(listener);
        panel.add(radioButton1);
        panel.add(radioButton2);
        frame.add(panel,BorderLayout.PAGE_END);
        frame.add(label);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(RadionButtonTest::showRadionButton);
    }
}
  • 效果图
    在这里插入图片描述

下拉框组件

  • 常用构造方法
    在这里插入图片描述

  • 常用的方法
    在这里插入图片描述

import javax.swing.*;

public class ComboBoxTest {
    public static void showComboBox(){
        JFrame frame = new JFrame("ComboBox");
        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        JPanel panel = new JPanel();
        JComboBox<String>comboBox = new JComboBox<>();
        comboBox.addItem("请选择城市:");
        comboBox.addItem("北京");
        comboBox.addItem("上海");
        comboBox.addItem("南京");
        panel.add(comboBox);
        frame.add(panel);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(ComboBoxTest::showComboBox);
    }
}
  • 效果图
    在这里插入图片描述

菜单组件

下拉式菜单

  • JMenu的常用方法
    在这里插入图片描述
import javax.swing.*;

public class JMenuTest {
    public static void showMenu(){
        JFrame frame = new JFrame("JMenu");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(500,300);
        frame.setLocationRelativeTo(null);

        JMenuBar menuBar = new JMenuBar();

        JMenu menu1 = new JMenu("菜单");
        JMenu menu2 = new JMenu("工具");

        menuBar.add(menu1);
        menuBar.add(menu2);

        JMenuItem menuItem1 = new JMenuItem("新建");
        JMenuItem menuItem2 = new JMenuItem("帮助");
        menu1.add(menuItem1);
        menu1.add(menuItem2);

        JMenuItem menuItem3 = new JMenuItem("设置");
        JMenuItem menuItem4 = new JMenuItem("退出");
        menu2.add(menuItem3);
        menu2.add(menuItem4);

        frame.setJMenuBar(menuBar);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(JMenuTest::showMenu);
    }
}
  • ** 效果图**
    在这里插入图片描述

弹出式菜单

import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class PopupMenuTest {
   public static void showPopupMenu(){
       JFrame frame = new JFrame("弹出菜单");
       frame.setVisible(true);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setSize(500,400);
       frame.setLocation(300,200);
       JPopupMenu popupMenu = new JPopupMenu();
       JMenuItem item1 = new JMenuItem("查看");
       JMenuItem item2 = new JMenuItem("刷新");
       popupMenu.add(item1);
       popupMenu.addSeparator();
       popupMenu.add(item2);
       frame.addMouseListener(new MouseAdapter() {
           @Override
           public void mouseClicked(MouseEvent e) {
               if (e.getButton()==MouseEvent.BUTTON3){
                   popupMenu.show(e.getComponent(),e.getX(),e.getY());
               }
           }
       });
   }

   public static void main(String[] args) {
       SwingUtilities.invokeLater(PopupMenuTest::showPopupMenu);
   }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业为何都用电子招投标 现代电子招投标系统介绍

在以前的传统招投标工作中&#xff0c;主要采用人工、书面文件的模式操作&#xff0c;往往产品没有得到很好地分类&#xff0c;导致整个招投标流程变得漫长且复杂。在传统招投标过程中通常需要三个月或更长时间&#xff0c;这对于买方或供应商企业而言是非常浪费时间的。如果还…

LIO-SAM代码解析——imageProjection.cpp

目录imageProjection.cpp1. ImageProjection类1.1. imuHandler1.2. odometryHandler1.3. cloudHandler⭐1.3.1. cachePointCloud&#xff1a; 点云消息缓存与检查1.3.2. deskewInfo() &#xff1a; 获得运动补偿信息1.3.2.1. imuDeskewInfo() &#xff1a; imu的补偿信息1.3.2.…

TOOM系统加强网络舆情监控的建议,如何加强网络舆情的引导和管控

网络舆情监控是指在互联网上通过技术手段&#xff0c;对网络上的舆情信息进行收集、整理、分析、评估和处理&#xff0c;以有效地识别、预测、处理网络舆情问题。网络舆情监控工作的目的是促进舆情健康&#xff0c;防止舆情危机。接下来简单了解TOOM系统加强网络舆情监控的建议…

Python基本语法与变量类型

一、Python基本语法 1、Python注释 Python 支持两种类型的注释&#xff0c;分别是单行注释和多行注释。 &#xff08;1&#xff09;单行注释 单行注释指的是从井号#开始&#xff0c;直到这行结束为止的所有内容都是注释。 # 注释内容&#xff08;2&#xff09;多行注释 Pyt…

ccflow-代码

报表设计目录概述需求&#xff1a;设计思路实现思路分析报表设计&#xff0c;流程运维系统&#xff08;三元log&#xff09;数据源管理和维护是否:debug状态. 0 表示不是, 1 是&#xff0c;如果系统发布后&#xff0c;请将此修改成0&#xff0c;以提高执行效率。在流程运行结束…

Python语言开发学习之使用Python预测天气

什么是wttr&#xff1f; 使用Python预测天气的第一步&#xff0c;我们要了解wttr是什么。wttr.in是一个面向控制台的天气预报服务&#xff0c;它支持各种信息表示方法&#xff0c;如面向终端的ANSI序列(用于控制台HTTP客户端(curl、httpie或wget))、HTML(用于web浏览器)或PNG(…

【微信小程序】解决点击(bindtap)和长按(bindlongtap)冲突

点击事件的执行&#xff1a; <button bindtap"bindtap" bindtouchstart"touchstart" bindtouchend"touchend">按钮</button>可以看到顺序为&#xff1a;touchstart → touchend → tap 长按事件的执行&#xff1a; <button bin…

Blender 渲染与后期处理

文章目录旋转环境贴图&#xff08;天空盒&#xff09;物体只渲染其他物体的阴影而不渲染自身渲染一个背景透明的图片在后期合成中&#xff0c;将渲染结果和一张图片合成到一起输出不同的通道方法一方法二后期制作景深效果渲染单个图层图层渲染单个图层旋转环境贴图&#xff08;…

对程序员超有用的网站!一定要收藏起来!

作为一名专业的程序员&#xff0c;我们应该利用各种渠道来扩充自己的知识。然后做一个技术高超的打工人&#xff01;&#xff08;&#xff09;然后用自己超高的技术&#xff0c;赚超多超多的money! (√) 但是要获取大量的信息就要有优质可靠的信息来源。今天我就把我珍藏的&…

CMOS图像传感器——深入ISO

在之前讲Dual Gain这一HDR技术时,有大致提到过ISO: HDR 成像技术学习(二)_沧海一升的博客-CSDN博客HDR成像技术介绍:staggered HDR、DOL-HDR、DCG,双原生ISO等。https://blog.csdn.net/qq_21842097/article/details/120904447 这一篇文章我们深入讲解一下。 通常…

IP协议详解

IP协议 IP协议格式&#xff1a; 4位版本号&#xff1a;指定IP协议的版本&#xff0c;对于IPv4来说&#xff0c;就是4。 4位首部长度&#xff1a;IP头部的长度是多少个32bit(4字节)&#xff0c;也就是 length * 4 的字节数。4bit表示最大的数字是15&#xff0c;因此IP头部最大…

学会这几招,轻松提升办公效率

技巧一&#xff1a;录屏 录屏需要使用“第三方工具/插件”吗&#xff1f;其实&#xff0c;PPT中有一个内置的“录屏”工具&#xff01; 使用PPT自带的“录屏”工具可以帮助我们快速录制电脑屏幕上的内容&#xff0c;录屏后的录屏结果会自动添加到PPT中&#xff0c;非常适合在PP…

JavaWeb_HTTP+Tomcat+Servlet

一、JavaWeb技术栈 B/S 架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器 架构模式&#xff0c;它的特点是&#xff0c;客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器&#xff0c;获取Web资源&#xff0c;服务器把We…

第三章.逻辑回归—正确率/召回率/F1指标,非线性逻辑回归代码

第三章.逻辑回归 3.2 正确率/召回率/F1指标 正确率(Precision)和召回率(Recall)广泛应用于信息检索和统计学分类领域的两个度量值&#xff0c;用来评价结果的质量。 1.概念&#xff1a; 1).正确率&#xff1a; 检索出来的条目有多少是正确的 2).召回率&#xff1a; 所有正…

Notepad++ 编写html代码快捷键切换到浏览器查看

一、设置Notepad 快速启动浏览器并且运行html1.找到Notepad的安装路径&#xff0c;找到Notepad 的shortcuts.xml文件。2.如图所示&#xff0c;用记事本打开【千万不要用Notepad打开】。打开之后可以看到里面的代码。以启动连接 chrome浏览器为例&#xff0c;选择对应的chrome 代…

【金融学】Financial Markets

Financial MarketsClass1 Financial Markets IntroductionWhat is Financial MarketsFinancial Topics课程目标Class1 Financial Markets Introduction What is Financial Markets “金融不仅仅是关于赚钱&#xff0c;金融应该是关于使某事发生” ----Robert Shiller. Financi…

TCP的3次握手细节

一、什么是TCP的三次握手在网络数据传输中&#xff0c;传输层协议TCP是要建立连接的可靠传输&#xff0c;TCP建立连接的过程&#xff0c;我们称为三次握手。三次握手的具体细节1. 第一次握手&#xff1a;Client将SYN置1&#xff0c;随机产生一个初始序列号seq发送给Server&…

虹科方案|使用 Thunderbolt™ 实现 VMware vSAN™ 连接

一、引言ATTO的Thunderbolt支持VMware ESXi 和ThunderLink产品线&#xff0c;使我们能够创建基于Mac的vSphere设置&#xff0c;从而能够为我们的macOS服务器提供虚拟化服务。 将虚拟硬件、快照和Veeam备份与macOS服务器的简单性相结合&#xff0c;将改变SMB市场的游戏规则。二、…

SVPWM控制技术+Matlab/Simulink仿真详解

文章目录前言一、SVPWM的控制原理二、空间矢量的概念三、电压与磁链空间矢量的关系四、三相逆变器的基本电压空间矢量五、SVPWM 算法的合成原理六、SVPWM 算法推导6.1.七段式SVPWM6.2.五段式SVPWM&#xff08;又称DPWM&#xff09;七、SVPWM 算法实现7.1.合成矢量Uref所处扇区的…

【手写 Promise 源码】第十篇 - Promise.prototype.catch 和 Promise.prototype.finally 的实现

theme: fancy 一&#xff0c;前言 上篇&#xff0c;主要实现了 Promise 的两个静态 API&#xff08;类方法&#xff09;&#xff1a;Promise.resolve 和 Promise.reject&#xff0c;主要涉及以下几个点&#xff1a; Promise.resolve 创建并返回一个成功的 promise&#xff1…