当前位置: 首页 > news >正文

【Java学习笔记】java图形界面编程

在前面的章节中,我们开发运行的应用程序都没有图形界面,但是很多应用软件,如Windows下的Office办公软件、扑克牌接龙游戏软件、企业进销存ERP系统等,都有很漂亮的图形界面。素以需要我们开发具有图形界面的软件。
Java图形界面编程内容主要包括AWT(Abstract Window Kit)和Swing两个部分。AWT是用来创建图形界面的基本工具,Swing是JFC(Java Foundation Classes)的一部分,是对AWT的有益补充。

1.AWT简介

AWT是抽象窗口工具类(Abstrat Window ToolKit)的缩写,AWT库中有60多个类和接口,几乎涵盖了创建Java图形界面程序的所有工具。利用AWT类库,可以在Applet的显示区域创建标签、按钮、复选框第二部分,还可以针对用户行为进行响应。
AWT是jdk的一部分,AWT为图形界面程序提供了所需的丰富的组件,同时还提供了对事件类、监听器类、图形处理工具,2D图形的支持
Java AWT类提供了四个主要的类,包括组件类(Component)、容器类(Container)、图形类(Graphics)和布局管理器。
AWT虽然提供了很多对图形界面的支持,但是缺少剪贴板支持、打印支持、没有弹出式菜单和滚动窗口等问题,所以产生了新的组件Swing来解决这些问题。

2.SWING基础

Swing元素比AWT元素存在更好的图形处理性能。Swing具有java的跨平台性,可以在任何平台上使用Swing图形界面组件。Swing的大部分组件是轻量级组件
Swing组件在不同平台上具有一致性的表现。Swing组件比AWT组件的实用性更强。Swing采用了MVC(Model-View-Controller,模型——视图——控制器)模式。

2.1 Swing的类层次结构

在javax.swing包中包含两种类型的组件:顶层容器(JFrame、JApplet、JDialog和JWindow)和轻量级组件。Swing轻量级组件是从AWT的Container类直接或间接派生过来的、
Swing包是JFC(Java Foundation Classes)的一部分,,javax.swing是其中最大的包,并且绝大部分Swing组件都包含在swing包中。
例:javax.swing.event包中定义了事件和事件处理类,这与java.awt.event包类似,主要包括事件类和监听器接口、事件适配等。

2.2 Swing的特点

  • MVC模式:MVC模式包括模型、视图和控制器等部分。Model(模型)用于保存所用到的数据模型,视图(View)用于显示数据内容,控制器(Controller)用于处理用户和模块交互事件。分层后,各层各司其职,协同工作,当模型的数据改变时,会通知与之相关的视图,视图通过控制器指定相应机制。为了更方便,Swing组件将视图和控制器 合二为一。

  • 组件的多样化:Swing组件的类名都是以字母J开头的。
    在这里插入图片描述

  • 可存取性支持 : 所有的Swing组件都实现了Accessible接口,这样一些辅助功能(如:屏幕阅读器)也可以得到支持

  • 设置边框:Swing组件不仅可以设置一个或多个边框,也可以让用户组合边框或自定义属于自己的边框

  • 支持键盘操作:JComponent类的RegisterKeyboardAction()方法可以实现用键盘操作替代用户鼠标操作。

  • 使用图标:Swing组件中的许多组件可以通过图标修饰自己。

2.3 swing程序结构简介

Java Swing的程序设计流程:
(1)使用import关键字导入swing包
(2)设置GUI的“外观界面风格”
(3)创建顶层容器
(4)创建按钮和标签等各种所需的组件
(5)将组件添加到顶层容器
(6)在组件周围添加边界
(7)进行事件处理
(8)结束
在这里插入图片描述

package swing;import javax.swing.*;		//导入swing包
import java.awt.*;			//导入awt包
import java.awt.event.*;	//导入awt事件处理包public class FirseSwingApp {public static void main(String[] args) {try {				//try语句块,监视该段程序UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());} catch (Exception e) {		//捕获异常e.printStackTrace();	//输出异常信息}JFrame frame = new JFrame("我的第一个Swing程序");Container c = frame.getContentPane();JPanel pane = new JPanel();c.add(pane);pane.setLayout(new FlowLayout());JLabel label = new JLabel();JButton button = new JButton("Press me");pane.add(label);pane.add(button);// 为增加按钮添加监听button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {label.setText("监听事件成功");}});frame.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});frame.setSize(400,280);frame.setVisible(true);}}

3.事件类

每一个事件类都与一个事件类接口相对应,由事件引起的动作都存放在接口需要实现的方法中。Java中,常用的事件类接口包括动作事件类、调整事件类、焦点事件类、项目事件类、按钮事件类、鼠标事件类、窗口事件类。

3.1 事件类的分类

所有与AWT相关的事件类都是java.awt.AWTEvent的派生类,AWTEvent也是java.util.EventObject类的派生类。
AWT事件包括低级事件和高级事件,低级事件时指源于组件或容器的事件,当组件或容器发生事件时,将触发事件。
高级事件是语义事件。这类事件与特定的具体事件不一定相对应,但是会 产生特定的事件对象。

3.2 动作事件类

动作事件类是指发生组件定义的语义事件。使用动作事件时需要给组件添加一个事件监听器ActionListener。ActionListener只有唯一的actionPerformed()方法。

   // 给按钮 增加 监听button.addActionListener(new ActionListener() {// 当按钮被点击时,就会触发 ActionEvent事件public void actionPerformed(ActionEvent e) {//按钮被操作}});

3.3 调整事件类

调整事件是滑动滚动条时发生的事件。为了监听调整事件,需要给ScrollBar添加一个调整事件监听器AdjustListener

scrollbar.addAdjustmentListener(new AdjustListener()){public void adjustmentValueChanged(AdjustmentEvent e){//调整滚动条}
}

3.4 焦点事件类

焦点事件类(FocusEvent)是指界面的组件失去焦点(焦点从一个对象转移到另外一个对象)时就会发生焦点事件。得到焦点事件的组件处于激活状态。

void FocusGained(FocusEvent e){// 当获得焦点时发生
}
void FocusLost(FocusEvent e){// 当失去焦点时发生
}

3.5 项目事件类

项目事件类(ItemEvent)是指某个项目(Item)时被选定、取消的语义事件,使用项目事件必须给组件添加一个实现ItemListener接口的事件处理器。

void itemStateChange(ItemEvent e)

3.6 键盘事件类

键盘事件类(KeyEvent)是指容器内任意组件获得焦点时,组件发生键击时,组件对象将产生该事件。

 f.addKeyListener(new KeyListener() {// 键被弹起public void keyReleased(KeyEvent e) {}//键被按下public void keyPressed(KeyEvent e) {// TODO Auto-generated method stub}// 一个按下弹起的组合动作public void keyTyped(KeyEvent e) {}});

3.7 鼠标事件类

鼠标事件类(MouseEvent)是指组件中发生鼠标动作时间,当鼠标移动到某个区域或单击某个组件时会触发鼠标事件。使用鼠标事件需要给组件添加MouseListener接口的事件处理器

 l.addMouseListener(new MouseListener() {// 释放鼠标public void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}// 按下鼠标public void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}// 鼠标退出public void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}// 鼠标进入public void mouseEntered(MouseEvent e) {}// 按下释放组合动作为点击鼠标public void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}}); 

3.8 窗口事件类

窗口事件类(WindowEvent)是指窗口状态改变的事件。使用窗口事件必须为组件添加一个实现WindowListener接口的事件处理器。

windowOpenedvoid windowOpened(WindowEvent e)
窗口首次变为可见时调用。windowClosingvoid windowClosing(WindowEvent e)
用户试图从窗口的系统菜单中关闭窗口时调用。windowClosedvoid windowClosed(WindowEvent e)
因对窗口调用 dispose 而将其关闭时调用。windowIconifiedvoid windowIconified(WindowEvent e)
窗口从正常状态变为最小化状态时调用。对于很多平台而言,已最小化的窗口将显示为窗口 iconImage 属性中所指定的图标。windowDeiconifiedvoid windowDeiconified(WindowEvent e)
窗口从最小化状态变为正常状态时调用。windowActivatedvoid windowActivated(WindowEvent e)
将 Window 设置为活动 Window 时调用。只有框架或对话框可以成为活动 Window。本机的窗口系统可能使用特殊装饰表示活动 Window 或其子窗口,如高亮显示标题栏。活动 Window 要么是聚焦 Window,要么是作为聚焦 Window 所有者的第一个 Frame 或 Dialog。
windowDeactivatedvoid windowDeactivated(WindowEvent e)
当 Window 不再是活动 Window 时调用。只有框架或对话框可以成为活动 Window。本机的窗口操作系统可能使用特殊装饰表示活动 Window 或其子窗口,如高亮显示标题栏。活动 Window 要么是聚焦 Window,要么是作为聚焦 Window 所有者的第一个 Frame 或 Dialog。

4 事件监听器

事件监听器的主要任务是对事件进行监听并进行相应处理。事件处理是图形界面程序设计必须做的工作。
当用户使用鼠标、键盘等外部设备输入发生事件时,可以使用事件监听处理器处理这些事件,从而实现相应的事件响应。事件监听器是为了处理特定时间而编写的方法。

4.1 事件监听器接口

不同的事件类对应不同的的事件监听器,他是事件监听器类的接口。

AWT的组件不仅可以注册监听器,还可以注销监听器

public void add<ListenerType> (<ListenerType>  listener ) //注册监听器
public void remove<ListenerType>(<ListenerType>  listener)//注销监听器

在这里插入图片描述

4.2 事件监听器特点

事件监听器接口是一个特殊的接口,与普通的接口相比,不同之处在于:
(1)一个监听器接口的类可以实现一个或或多个接口,并且接口之间用逗号隔开

implements MouseMotionListener,MouseLinstener,WindowListener;

(2) 同一个组件可以监听一个事件源的多个事件
即在对象ob上接收多个事件,并被同一个监听器接收和处理。

ob.addMouseMotionListener(this) ; 		//添加鼠标动作监听器
ob.addMouseListener(this);		//添加鼠标监听器
ob.addWindowListener(this);		//添加窗口监听器

(3)事件处理这和事件源可以处在同一个类中。
上述程序事件中,事件源是窗口对象ob,事件处理这是类TreeListener,其中ob是类TreeLIstener的成员变量
(4)通过事件对象可以获得一些信息。例如,可以获得组件中鼠标的位置坐标。

public void mouseMoved(MouseEvent e){Strng str = "鼠标移动";ob1.setText(s);ob2.setText("鼠标坐标为:" + e.getX() + e.getY());
}

Java语言只支持单继承,但可以通过接口实现多继承的功能。

在AWT中经常实现多个监听器接口,每一个接口中已定义的方法必须实现。如果针对某事件不做任何处理,就不需要实现这个方法,方法体为空。

5.轻量级容器

Jframe的内部轻量级容器结构图:
在这里插入图片描述
在这里插入图片描述
用户添加的组件都在contentPane上,背景图片只能添加到layeredPane.
GlassPane是完全透明的,默认值为不可见。
覆盖content的目的是为了接收鼠标事件和组件绘图功能提供方便。

5.1 根面板(JRootPanel)

根面板(JRootPanel)由contentPane、menuBar、glassPlane构成

5.2 面板(JPanel)

面板(JPanel)是轻量级容器,用法与Panel基本相同,用于收纳其他的组件。

5.3 分层面板(JLayeredPane)

Swing有JLayeredPane、JDesktopPane两种类型的分层面板,JDesktopPane是JLayeredPane的派生类,用于创建多文档和虚拟桌面程序的容器

5.4 滚动窗口(JScrollPane)

滚动窗口(JScrollPane)是管理窗口(JViewport)、可选水平或垂直滚动的轻量级容器。滚动窗口有JScrollBar、JViewPort之间的链接组成

5.5 分隔板(JSplitPane)

分隔板(JSplitPane)用于提供可以拆分的窗口,但只能分割成两个容器。支持水平和竖直两种拆分类型,可带滚动条

5.6 选项板(JTabbedPane)

选项板(JTabbedPane)提供允许用户通过单击具有标题和图标的选项卡,在组件之间进行来回切换的组件,通过addTab()和insertTab()方式添加选项卡、组件到TabbedPane对象中。

5.7 工具栏(JToolBar)

工具栏(JToolBar)是显示常用工具组件的容器。可以将工具栏单独拖出作为一个独立的工具条。

6. Swing组件

Swing组件与AWT组件类似,但又为每个组件添加了新的方法。

6.1 按钮(Button)

在Swing中,所有类型的按钮都是javax.swing.AbstractButton类的子类。

6.2 复选框(JChekBox)

该类是javax.swing.JToggleButton类的子类。

6.3 单选框(JRadioButton)

单选框(JRadioButton)与AWT中的复选框功能类似,
JRadioButton 和 ButtonGroup配合使用时可以创建一组数组,但一次只能选择其中的一个按钮,通过add()方法将JRadioButton对象添加到该组中。

6.4 组合框(JComboBox)

组合框是将按钮、可编辑字段及下拉菜单组合在一起的操作。用户可以从下拉菜单中选则不同的值。

6.5 进度条(JProgressBar)

进度条是以图形化的方式来描述任务进度的组件。在任务完成的过程中,进度条显示该任务完成的百分比。

6.6 表格(JTable)

在界面上将数据以表格的形式展示,可以采用表格控件(JTable)来实现。
表格控件是Swing新增加的组件。主要是为了将数据以表格的形式显示。

6.7 树(JTree)

很多时候需要使用树状控件展示数据,如Windows的文件浏览器就像现行的树状控件。树(JTree)中特定的节点可以由TreePath标识或由其显示行标识。可查看的父类节点都是可以展开的,但是他们可以显示也可以不显示。显示节点必须是可以查看的,并且位于显示区域。

7 拓展训练

7.1 设置闪烁的标题栏

【Timer控件】
在银行,股票,比赛系统中经常出现同时处理并显示业务数据的情况,每个窗口和窗口中的数据分类和重要性并不相通。当有的信息重要性很高,必须以醒目的方式提醒读者注意的时候,可以采用闪烁的标题栏来动态突出某窗口信息的重要性。
【例】在TimerFlashBar类的主方法中创建Timer控件,并在空间中实现窗口闪烁的效果。该效果一直循环,每隔1秒闪烁一次

package swing;import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;import javax.swing.Timer;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;public class TimerFlashBar  extends JFrame{
//
//	private static final long serialVersionUID private JPanel contentPane;public static void main(String[] args) {EventQueue.invokeLater(new Runnable() { //把事件添加到AWT的事件处理线程中public void run() {try {TimerFlashBar frame = new TimerFlashBar();frame.setVisible(true);}catch(Exception e) {e.printStackTrace();}}});}public TimerFlashBar() {addWindowListener(new WindowAdapter() {@Overridepublic void windowOpened(WindowEvent e) {do_this_windowOpened(e);} });setTitle("设置闪烁的标题栏");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,273,130);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5,5,5,5));contentPane.setLayout(new BorderLayout(0,0));setContentPane(contentPane);JLabel label = new JLabel("系统内存紧缺,请立即保存数据");label.setHorizontalAlignment(SwingConstants.CENTER);}protected void do_this_windowOpened(WindowEvent e) {Timer timer = new Timer(500,new ActionListener() {String title = getTitle();public void actionPerformed(ActionEvent e) {if(getTitle().isEmpty()) {setTitle(title);}else {setTitle("");}}});timer.start();}
}

在这里插入图片描述

7.2 建立简单的时钟布局

【布局管理器】
Java提供了流布局、边框布局、网格布局等多种布局方式,其实我们也可以自定义一个布局管理器

package swing;import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.LayoutManager;public class UseCloakLayout implements LayoutManager {public void addLayoutComponent(String name,Component comp) {}public void layoutContainer(Container parent) {double centerX = parent.getBounds().getCenterX();double centerY = parent.getBounds().getCenterY();Insets insets = parent.getInsets();double horizon = centerX - insets.left;double vertical = centerY - insets.top;double radius = horizon > vertical ? vertical:horizon;//设置时钟半径int count = parent.getComponentCount();//获得控件个数for(int i = 0;i<count;i++) {Component component = parent.getComponent(i);if(component.isVisible()) {Dimension size = component.getPreferredSize();double angle = 2 * Math.PI*i/count;//获得角度大小double x = centerX + radius*Math.sin(angle);double y = centerY - radius*Math.cos(angle);//重新设置控件的位置和大小component.setBounds((int)x-size.width/2,(int)y-size.height/2, size.width, size.height);}}}//给定指定容器所包含的控件,计算该容器的最小大小维度数@Overridepublic Dimension minimumLayoutSize(Container parent) {// TODO Auto-generated method stubreturn parent.getMinimumSize();}@Overridepublic Dimension preferredLayoutSize(Container parent) {// TODO Auto-generated method stubreturn parent.getPreferredSize();}@Overridepublic void removeLayoutComponent(Component comp) {// TODO Auto-generated method stub}}
package swing;import java.awt.BorderLayout;
import java.awt.EventQueue;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;public class CloakLayoutTest extends JFrame{private JPanel contentPane;public static void main(String[] args) {try {UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");}catch(Throwable e) {e.printStackTrace();}EventQueue.invokeLater(new Runnable() {@Overridepublic void run() {try {ClockLayoutTest frame = new ClockLayoutTest();frame.setVisible(true);}catch(Exception e) {e.printStackTrace();}}});}public CloakLayoutTest() {setTitle("建立时钟布局");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,450,300);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5,5,5,5));contentPane.setLayout(new BorderLayout(0,0));setContentPane(contentPane);setLayout(new ClockLayoutTest());for(int i = 0;i<12;i++) {if(i<10) {add(new JButton(""+i));}else {add(new JButton(""+i));}}}}

7.3简单投票系统

【多个组件的使用】
在日常生活中,我们经常会遇到进行投票的情况。本例实现一个简单的投票计数软件

在这里插入图片描述

package swing;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;public class VoteCount extends JFrame{private JPanel contentPane;//设置4个复选框private JCheckBox checkBox1;private JCheckBox checkBox2;private JCheckBox checkBox3;private JCheckBox checkBox4;//设置4个标签private JLabel label1;private JLabel label2;private JLabel label3;private JLabel label4;//设置4个进度条private JProgressBar progressBar1;private JProgressBar progressBar2;private JProgressBar progressBar3;private JProgressBar progressBar4;public static void main(String[] args) {	try {UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");}catch(Throwable e){e.printStackTrace();}EventQueue.invokeLater(new Runnable() {public void run() {try {VoteCount frame = new VoteCount();frame.setVisible(true);}catch(Exception e) {e.printStackTrace();}}});}public VoteCount() {setTitle("简单投票系统");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,450,300);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5,5,5,5));setContentPane(contentPane);contentPane.setLayout(new BorderLayout(0,0));JPanel buttonPanel = new JPanel();contentPane.add(buttonPanel,BorderLayout.SOUTH);JButton submitButton = new JButton("提交");submitButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_submitButton_actionPerformed(e);}});buttonPanel.add(submitButton);JButton refreshButton = new JButton("刷新");refreshButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_refreshButton_actionPerformed(e);}});buttonPanel.add(refreshButton);JPanel panel = new JPanel();panel.setBorder(new TitledBorder(new LineBorder(new Color(0,0,0)),"我最喜爱的水果",TitledBorder.LEADING,TitledBorder.TOP,null,new Color(59,59,59)));contentPane.add(panel,BorderLayout.CENTER);panel.setLayout(new GridLayout(4,1,15,15));//第一条记录JPanel panel1 = new JPanel();panel.add(panel1);panel1.setLayout(new BorderLayout(0,0));checkBox1 = new JCheckBox("苹果");panel1.add(checkBox1,BorderLayout.WEST);label1 = new JLabel("0票");panel1.add(label1,BorderLayout.EAST);progressBar1 = new JProgressBar();progressBar1.setStringPainted(true);panel1.add(progressBar1,BorderLayout.CENTER);//第二条记录JPanel panel2 = new JPanel();panel.add(panel2);panel2.setLayout(new BorderLayout(0,0));checkBox2 = new JCheckBox("香蕉");panel2.add(checkBox2,BorderLayout.WEST);label2 = new JLabel("0票");panel2.add(label2,BorderLayout.EAST);progressBar2 = new JProgressBar();progressBar2.setStringPainted(true);panel2.add(progressBar2,BorderLayout.CENTER);//第三条记录JPanel panel3 = new JPanel();panel.add(panel3);panel3.setLayout(new BorderLayout(0,0));checkBox3 = new JCheckBox("梨");panel3.add(checkBox3,BorderLayout.WEST);label3 = new JLabel("0票");panel3.add(label3,BorderLayout.EAST);progressBar3 = new JProgressBar();progressBar3.setStringPainted(true);panel3.add(progressBar3,BorderLayout.CENTER);//第四条记录JPanel panel4 = new JPanel();panel.add(panel4);panel4.setLayout(new BorderLayout(0,0));checkBox4 = new JCheckBox("桃子");panel4.add(checkBox4,BorderLayout.WEST);label4 = new JLabel("0票");panel4.add(label4,BorderLayout.EAST);progressBar4 = new JProgressBar();progressBar4.setStringPainted(true);panel4.add(progressBar4,BorderLayout.CENTER);}protected void do_submitButton_actionPerformed(ActionEvent e) {String text1 = label1.getText(); //获得标签文本int number1 = Integer.parseInt(text1.substring(0,text1.length()-1));//获得票数String text2 = label1.getText(); //获得标签文本int number2 = Integer.parseInt(text1.substring(0,text1.length()-1));//获得票数String text3 = label1.getText(); //获得标签文本int number3 = Integer.parseInt(text1.substring(0,text1.length()-1));//获得票数String text4 = label1.getText(); //获得标签文本int number4 = Integer.parseInt(text1.substring(0,text1.length()-1));//获得票数if(checkBox1.isSelected()) { //如果被选中number1++;				//票数+1label1.setText(number1+"票");//更新标签}if(checkBox2.isSelected()) {number2++;label2.setText(number2+"票");}if(checkBox3.isSelected()) {number3++;label3.setText(number3+"票");}if(checkBox4.isSelected()) {number4++;label4.setText(number4+"票");}//计算总票数double total = number1 + number2 + number3 +number4;progressBar1.setString(number1*100/total+"%"); //在进度条上显示票数progressBar1.setValue(number1);progressBar2.setString(number2*100/total+"%"); //在进度条上显示票数progressBar2.setValue(number2);progressBar3.setString(number3*100/total+"%"); //在进度条上显示票数progressBar3.setValue(number3);progressBar4.setString(number4*100/total+"%"); //在进度条上显示票数progressBar4.setValue(number4);}protected void do_refreshButton_actionPerformed(ActionEvent e) {//建立动作事件的响应checkBox1.setSelected(false);checkBox2.setSelected(false);checkBox3.setSelected(false);checkBox4.setSelected(false);}}

7.4 包含图片的弹出菜单

【JPopMenu的使用】
Windows应用软件单击鼠标右键,会出现一个弹出菜单,菜单可以进行排列桌面图片、创建文件或文件夹等操作。本例演示如何利用Swing创建包含图片的弹出菜单

package swing;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JProgressBar;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;class PopupMenuImage extends Frame{private JPanel contentPane;public static void main(String[] args) {try {UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");}catch(Throwable e) {e.printStackTrace();}EventQueue.invokeLater(new Runnable() {public void run() {try {PopupMenuImage frame = new PopupMenuImage();frame.setVisible(true);}catch(Exception e){e.printStackTrace();}}});}public PopupMenuImage() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,300,200);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5,5,5,5));JPopupMenu popupMenu = new JPopupMenu();contentPane.setComponentPopupMenu(popupMenu);JMenuItem cut = new JMenuItem("剪切");cut.setIcon(new ImageIcon(PopupMenuImage.class.getResource("./cut.jpg")));cut.addActionListener(listener);popupMenu.add(cut);JMenuItem copy = new JMenuItem("拷贝");copy.setIcon(new ImageIcon(PopupMenuImage.class.getResource("./cpoy.jpg")));copy.addActionListener(listener);popupMenu.add(copy);JMenuItem paste = new JMenuItem("粘贴");paste.setIcon(new ImageIcon(PopupMenuImage.class.getResource("./paste.jpg")));paste.addActionListener(listener);popupMenu.add(paste);contentPane.setLayout(new BorderLayout(0,0));setContentPane(contentPane);label = new JLabel("单击鼠标右键弹出菜单");contentPane.add(label,BorderLayout.NORTH);}private void setDefaultCloseOperation(int exitOnClose) {// TODO Auto-generated method stub}private void setContentPane(JPanel contentPane2) {// TODO Auto-generated method stub}private ActionListener listener = new ActionListener() {public void actionPerformed(ActionEvent e) {label.setText(e.getActionCommand());}};
private JLabel label;}

7.5 震动效果提示信息

在这里插入图片描述

package swing;import javax.swing.Timer;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;import javax.swing.JDialog;
import javax.swing.JOptionPane;public class ShakeEffect {private JDialog dialog;private Point start;private Timer shakeTimer;public ShakeEffect(JDialog dialog) {this.dialog = dialog;}public void startShake() { //开始震动方法final long startTime = System.currentTimeMillis();//获得程序运行起始时间start = dialog.getLocation();shakeTimer = new Timer(10,new ActionListener() {public void actionPerformed(ActionEvent e) {long elapsed = System.currentTimeMillis() - startTime;Random random = new Random(elapsed);int change = random.nextInt(50);dialog.setLocation(start.x +change,start.y+change);//随机改变坐标if(elapsed >=1000) {stopShake();}}});shakeTimer.start();}public void stopShake() {shakeTimer.stop();dialog.setLocation(start);dialog.repaint();}public static void main(String[] args) {JOptionPane pane = new JOptionPane("特别注意",JOptionPane.WARNING_MESSAGE);JDialog d = pane.createDialog(null,"震动效果对话框");//获得对话框对象ShakeEffect sd = new ShakeEffect(d);d.pack();d.setModal(false);d.setVisible(true);sd.startShake();}}

8 答疑解惑

swing是一个用于开发Java应用程序图形界面的开发工具包,以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。
一般的桌面应用,使用Java Swing是绰绰有余的。但是大型网站、ERP等大型项目不适合使用Swing。

相关文章:

【Java学习笔记】java图形界面编程

在前面的章节中&#xff0c;我们开发运行的应用程序都没有图形界面&#xff0c;但是很多应用软件&#xff0c;如Windows下的Office办公软件、扑克牌接龙游戏软件、企业进销存ERP系统等&#xff0c;都有很漂亮的图形界面。素以需要我们开发具有图形界面的软件。 Java图形界面编程…...

STM32入门笔记(03): ADC(SPL库函数版)(2)

A/D转换的常用技术有逐次逼近式、双积分式、并行式和跟踪比较式等。目前用的较多的是前3种。 A/D转换器的主要技术指标 转换时间 分辨率 例如&#xff0c;8位A/D转换器的数字输出量的变化范围为0&#xff5e;255&#xff0c;当输入电压的满刻度为5V时&#xff0c;数字量每变化…...

2024年7月2日 (周二) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 经典名作30周年新篇《恐怖惊魂夜…...

如何使用Spring Boot Profiles进行环境配置管理

如何使用Spring Boot Profiles进行环境配置管理 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨如何利用Spring Boot Profiles来管理不同环境…...

Java错题归纳(二)

1、若有如下接口A的定义&#xff0c;下列哪些类下确实现了该接口&#xff1a;C interface A { void method1(int i); void method2(int j); } A class B implements A{ void method1( ) { } void method2( ) { } } B class B implements A { void method1(int i ) { }…...

Grafana面试题精选和参考答案

目录 Grafana是什么以及它的主要应用场景 Grafana支持的数据源 Grafana的体系结构及主要组件 Grafana如何实现数据的可视化和监控 Grafana支持的图表类型 如何在Grafana中创建和编辑仪表盘 Grafana的查询编辑器功能 Grafana支持的认证方式 Grafana的性能调优建议 Gra…...

Node版本管理工具 fnm 安装使用

fnm 是一个基于 Rust 开发的 Node 版本管理工具&#xff0c;它的目标是提供一个快速、简单且可靠的方式来管理 Node.js 的不同版本。同时&#xff0c;它是跨平台的&#xff0c;支持 macOS、Linux、Windows。&#x1f680; Fast and simple Node.js version manager, built in R…...

vector模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityopera…...

《每天5分钟用Flask搭建一个管理系统》第11章:测试与部署

第11章&#xff1a;测试与部署 11.1 测试的重要性 测试是确保应用质量和可靠性的关键步骤。它帮助开发者发现和修复错误&#xff0c;验证功能按预期工作。 11.2 Flask测试客户端的使用 Flask提供了一个测试客户端&#xff0c;可以在开发过程中模拟请求并测试应用的响应。 …...

Landsat数据从Collection1更改为Collection2

目录 问题解决 问题 需要注意!您使用的是废弃的陆地卫星数据集。为确保功能持续&#xff0c;请在2024年7月1日前更新。 在使用一些以前的代码时会遇到报错&#xff0c;因为代码里面用的是老的数据集 解决 对于地表反射率SR&#xff0c;需要在name中&#xff0c;将C01换为C02&…...

《每天5分钟用Flask搭建一个管理系统》第12章:安全性

第12章&#xff1a;安全性 12.1 Web应用的安全威胁 Web应用面临的安全威胁包括但不限于跨站脚本攻击&#xff08;XSS&#xff09;、SQL注入、跨站请求伪造&#xff08;CSRF&#xff09;、不安全的直接对象引用&#xff08;IDOR&#xff09;等。 12.2 Flask-Talisman扩展的使…...

Unity之创建与导出PDF

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之创建与导出PDF TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01; 助力快速…...

【Android面试八股文】优化View层次过深问题,选择哪个布局比较好?

优化深层次View层次结构的问题&#xff0c;选择合适的布局方式是至关重要的。以下是几点建议&#xff1a; 使用ConstraintLayout&#xff1a;ConstraintLayout是Android开发中推荐的布局&#xff0c;能够有效减少嵌套&#xff0c;提高布局性能。相比RelativeLayout&#xff0c;…...

什么是带有 API 网关的代理?

带有 API 网关的代理服务显著提升了用户体验和性能。特别是对于那些使用需要频繁创建和轮换代理的工具的用户来说&#xff0c;使用 API 可以节省大量时间并提高效率。 了解 API API&#xff0c;即应用程序编程接口&#xff0c;是服务提供商和用户之间的连接网关。通过 API 连接…...

sql拉链表

1、定义&#xff1a;维护历史状态以及最新数据的一种表 2、使用场景 1、有一些表的数据量很大&#xff0c;比如一张用户表&#xff0c;大约1亿条记录&#xff0c;50个字段&#xff0c;这种表 2.表中的部分字段会被update更新操作&#xff0c;如用户联系方式&#xff0c;产品的…...

STM32CubeMX实现矩阵按键(HAL库实现)

功能描述&#xff1a; 实现矩阵按键验证&#xff0c;将矩阵按键的按键值&#xff0c;通过串口显示&#xff0c;便于后面使用。 实物图 原理图&#xff1a; 编程原理&#xff1a; 原理很简单&#xff0c;就是通过循环设置引脚为低电平&#xff0c;另外引脚扫描读取电平值&…...

mmdetection3D指定版本安装指南

1. 下载指定版本号 选择指定版本号下载mmdetection3d的源码&#xff0c;如这里选择的是0.17.2版本 git clone https://github.com/open-mmlab/mmdetection3d.git -b v0.17.22. 安装 cd mmdetection3d安装依赖库 pip install -r requirment.txt编译安装 pip install -v e .…...

SQLMap工具详解与SQL注入防范

SQLMap工具详解与SQL注入防范 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨SQLMap工具的详细使用方法以及如何防范SQL注入攻击。 SQL注入简介 SQL注入是一种常见的安全漏洞&am…...

如何在Java中实现自定义数据结构:从头开始

如何在Java中实现自定义数据结构&#xff1a;从头开始 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Java中实现自定义数据结构&#xff…...

【机器学习】在【Pycharm】中的应用:【线性回归模型】进行【房价预测】

专栏&#xff1a;机器学习笔记 pycharm专业版免费激活教程见资源&#xff0c;私信我给你发 python相关库的安装&#xff1a;pandas,numpy,matplotlib&#xff0c;statsmodels 1. 引言 线性回归&#xff08;Linear Regression&#xff09;是一种常见的统计方法和机器学习算法&a…...

如何在 Linux 中后台运行进程?

一、后台进程 在后台运行进程是 Linux 系统中的常见要求。在后台运行进程允许您在进程独立运行时继续使用终端或执行其他命令。这对于长时间运行的任务或当您想要同时执行多个命令时特别有用。 在深入研究各种方法之前&#xff0c;让我们先了解一下什么是后台进程。在 Linux 中…...

软考-软件设计师

软考 软考科目 软考分为初级、中级、高级&#xff0c;初级含金量相对不够&#xff0c;高级考试有难度&#xff0c;所以大多数人都在考中级&#xff0c;中级也分很多科目&#xff0c;我考的是软件设计师&#xff08;已经通过&#xff09;。 合格标准 考试分为上午题和下午题…...

UOS系统中JavaFx笔锋功能

关于笔锋功能&#xff0c;网上找了很久&#xff0c;包括Java平台客户端&#xff0c;Android端&#xff0c;相关代码资料比较少&#xff0c;找了很多经过测试效果都差强人意&#xff0c;自己也搓不出来&#xff0c;在UOS平台上JavaFX也获取不到压力值&#xff0c;只能用速度的变…...

后端加前端Echarts画图示例全流程(折线图,饼图,柱状图)

本文将带领读者通过一个完整的Echarts画图示例项目&#xff0c;演示如何结合后端技术&#xff08;使用Spring Boot框架&#xff09;和前端技术&#xff08;使用Vue.js或React框架&#xff09;来实现数据可视化。我们将实现折线图、饼图和柱状图三种常见的数据展示方式&#xff…...

ValidateAntiForgeryToken、AntiForgeryToken 防止CSRF(跨网站请求伪造)

用途&#xff1a;防止CSRF&#xff08;跨网站请求伪造&#xff09;。 用法&#xff1a;在View->Form表单中: aspx&#xff1a;<%:Html.AntiForgeryToken()%> razor&#xff1a;Html.AntiForgeryToken() 在Controller->Action动作上&#xff1a;[ValidateAntiForge…...

《昇思25天学习打卡营第5天 | mindspore 网络构建 Cell 常见用法》

1. 背景&#xff1a; 使用 mindspore 学习神经网络&#xff0c;打卡第五天&#xff1b; 2. 训练的内容&#xff1a; 使用 mindspore 的 nn.Cell 构建常见的网络使用方法&#xff1b; 3. 常见的用法小节&#xff1a; 支持一系列常用的 nn 的操作 3.1 nn.Cell 网络构建&…...

SQLServer:从数据类型 varchar 转换为 numeric 时出错。

1.工作要求 计算某两个经纬度距离 2.遇到问题 从数据类型 varchar 转换为 numeric 时出错。 3.解决问题 项目版本较老&#xff0c;使用SQLServer 2012 计算距离需执行视图&#xff0c;如下&#xff1a; SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO ALTER view vi_ord…...

探索迁移学习:通过实例深入理解机器学习的强大方法

探索迁移学习&#xff1a;通过实例深入理解机器学习的强大方法 &#x1f341;1. 迁移学习的概念&#x1f341;2. 迁移学习的应用领域&#x1f341;2.1 计算机视觉&#x1f341;2.2 自然语言处理&#xff08;NLP&#xff09;&#x1f341;2.3 医学图像分析&#x1f341;2.4 语音…...

【Linux】性能分析器 perf 详解(四):trace

上一篇:【Linux】性能分析器 perf 详解(三) 1、trace 1.1 简介 perf trace 类似于 strace 工具:用于对Linux系统性能分析和调试的工具。 原理是:基于 Linux 性能计数器(Performance Counters for Linux, PCL),监控和记录系统调用和其他系统事件。 可以提供关于硬件…...

信息安全体系架构设计

对信息系统的安全需求是任何单一安全技术都无法解决的&#xff0c;要设计一个信息安全体系架构&#xff0c;应当选择合适的安全体系结构模型。信息系统安全设计重点考虑两个方面&#xff1b;其一是系统安全保障体系&#xff1b;其二是信息安全体系架构。 1.系统安全保障体系 安…...

GPT-5即将登场:AI赋能下的未来工作与日常生活新图景

随着OpenAI首席技术官米拉穆拉蒂在近期采访中的明确表态&#xff0c;GPT-5的发布已不再是遥不可及的梦想&#xff0c;而是即将在一年半后与我们见面的现实。这一消息无疑在科技界乃至全社会引发了广泛关注和热烈讨论。从GPT-4到GPT-5的飞跃&#xff0c;被形容为从高中生到博士生…...

RocketMQ实战:一键在docker中搭建rocketmq和doshboard环境

在本篇博客中&#xff0c;我们将详细介绍如何在 Docker 环境中一键部署 RocketMQ 和其 Dashboard。这个过程基于一个预配置的 Docker Compose 文件&#xff0c;使得部署变得简单高效。 项目介绍 该项目提供了一套 Docker Compose 配置&#xff0c;用于快速部署 RocketMQ 及其…...

前端项目vue3/React使用pako库解压缩后端返回gzip数据

pako仓库地址&#xff1a;https://github.com/nodeca/pako 文档地址&#xff1a;pako 2.1.0 API documentation 外部接口返回一个直播消息或者图片数据是经过zip压缩的&#xff0c;前端需要把这个数据解压缩之后才可以使用&#xff0c;这样可以大大降低网络数据传输的内容&…...

C++专业面试真题(1)学习

TCP和UDP区别 TCP 面向连接。在传输数据之前&#xff0c;通信双方需要先建立一个连接&#xff08;三次握手&#xff09;。可靠性。TCP提供可靠的数据传输&#xff0c;它通过序列号、确认应答、重传机制和校验和等技术确保数据的正确传输。数据顺序&#xff1a;TCP保证数据按发…...

2024 年人工智能和数据科学的五个主要趋势

引言 2023年&#xff0c;人工智能和数据科学登上了新闻头条。生成性人工智能的兴起无疑是这一显著提升曝光度的驱动力。那么&#xff0c;在2024年&#xff0c;该领域将如何继续占据头条&#xff0c;并且这些趋势又将如何影响企业的发展呢&#xff1f; 在过去几个月&#xff0c;…...

GPU云渲染平台到底怎么选?这六点要注意!

随着对高效计算和图像处理需求的增加&#xff0c;GPU云渲染平台成为许多行业的关键工具。尤其是对影视动画制作领域来说&#xff0c;选择一个合适的GPU云渲染平台可以大大提升工作效率。然而&#xff0c;面对市场上众多的选择&#xff0c;如何找到适合自己的GPU云渲染平台呢&am…...

【区块链+基础设施】国家健康医疗大数据科创平台 | FISCO BCOS应用案例

在医疗领域&#xff0c;疾病数据合法合规共享是亟待解决的难题。一方面&#xff0c;当一家医院对患者实施治疗后&#xff0c;若患者转到其 他医院就医&#xff0c;该医院就无法判断诊疗手段是否有效。另一方面&#xff0c;医疗数据属于个人敏感数据&#xff0c;一旦被泄露或被恶…...

redis压测和造数据方式

一、redis 压测工具 1、压测命令 1、对3000字节的数据进行get set的操作 redis-benchmark -h 10.166.15.36 -p 7001 -t set,get -n 100000 -q -d 3000 2、100个并发连接&#xff0c;100000个请求&#xff0c;检测host为localhost 端口为6379的redis服务器性能 redis-benchma…...

数据存储方案选择:ES、HBase、Redis、MySQL与MongoDB的应用场景分析

一、概述 1.1 背景 在当今数据驱动的时代&#xff0c;选择合适的数据存储技术对于构建高效、可靠的信息系统至关重要。随着数据量的爆炸式增长和处理需求的多样化&#xff0c;市场上涌现出了各种数据存储解决方案&#xff0c;每种技术都有其独特的优势和适用场景。Elasticsear…...

数组理论基础

1. **数组定义**&#xff1a; - 数组是存放在连续内存空间上的相同类型数据的集合。 2. **数组特性**&#xff1a; - 数组下标从0开始。 - 数组的内存空间地址是连续的。 3. **数组操作**&#xff1a; - 数组可以通过下标索引快速访问元素。 - 数组元素的删除…...

FlinkCDC 数据同步优化及常见问题排查

【面试系列】Swift 高频面试题及详细解答 欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 欢迎关注微信公众号&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、…...

手把手edusrc漏洞挖掘和github信息收集

0x1 前言 这里主要还是介绍下新手入门edusrc漏洞挖掘以及在漏洞挖掘的过程中信息收集的部分哈&#xff01;&#xff08;主要给小白看的&#xff0c;大佬就当看个热闹了&#xff09;下面的话我将以好几个不同的方式来给大家介绍下edusrc入门的漏洞挖掘手法以及利用github信息收…...

linux系统中的各种命令的解释和帮助(含内部命令、外部命令)

目录 一、说明 二、命令详解 1、帮助命令的种类 &#xff08;1&#xff09;help用法 &#xff08;2&#xff09;--help用法 2、如何区别linux内部命令和外部命令 三、help和—help 四、man 命令 1、概述 2、语法和命令格式 &#xff08;1&#xff09;man命令的格式&…...

Gemma轻量级开放模型在个人PC上释放强大性能,让每个桌面秒变AI工作站

Google DeepMind团队最近推出了Gemma&#xff0c;这是一个基于其先前Gemini模型研究和技术的开放模型家族。这些模型专为语言理解、推理和安全性而设计&#xff0c;具有轻量级和高性能的特点。 Gemma 7B模型在不同能力领域的语言理解和生成性能&#xff0c;与同样规模的开放模型…...

Git使用中遇到的问题(随时更新)

问题1.先创建本地库&#xff0c;后拉取远程仓库时上传失败的问题怎么解决&#xff1f; 操作主要步骤&#xff1a; step1 设置远程仓库地址: $ git remote add origin gitgitee.com:yourAccount/reponamexxx.git step2 推送到远程仓库: $ git push -u origin "master&qu…...

php 跨域问题

设置header <?php $origin isset($_SERVER[HTTP_ORIGIN])? $_SERVER[HTTP_ORIGIN]:;$allow_originarray(http://www.aaa.com,http://www.bbb.com, ); if( $origin in $allow_origin ){header("Access-Control-Allow-Origin:".$origin);header("Access-Co…...

【leetcode52-55图论、56-63回溯】

图论 回溯...

2024 年江西省研究生数学建模竞赛题目 A题交通信号灯管理---完整文章分享(仅供学习)

问题&#xff1a; 交通信号灯是指挥车辆通行的重要标志&#xff0c;由红灯、绿灯、黄灯组成。红灯停、绿灯行&#xff0c;而黄灯则起到警示作用。交通信号灯分为机动车信号灯、非机动车信号灯、人行横道信号 灯、方向指示灯等。一般情况下&#xff0c;十字路口有东西向和南北向…...

日志可视化监控体系ElasticStack 8.X版本全链路实战

目录 一、SpringBoot3.X整合logback配置1.1 log4j、logback、self4j 之间关系 1.2 SpringBoot3.X整合logback配置 二、日志可视化分析ElasticStack 2.1为什么要有Elastic Stack 2.2 什么是Elastic Stack 三、ElasticSearch8.X源码部署 ​四、Kibana源码部署 五、LogSta…...

【LinuxC语言】定义线程池结果

文章目录 前言任务结构体线程池定义总结前言 在并发编程中,线程池是一种非常重要的设计模式。线程池可以有效地管理和控制线程的数量,避免线程频繁创建和销毁带来的性能开销,提高系统的响应速度。在Linux环境下,我们可以使用C语言来实现一个简单的线程池。 线程池的主要组…...

网安小贴士(6)TCP/IP分层

一、前言 1983年&#xff0c;美国国防部决定将TCP/IP作为所有计算机网络的标准协议&#xff0c;这标志着TCP/IP正式成为互联网的基础协议。随着个人计算机的普及和网络技术的发展&#xff0c;TCP/IP模型被广泛应用于各种网络环境中&#xff0c;包括局域网&#xff08;LAN&#…...

ubuntu运行qq音乐闪退

ubuntu运行qq音乐闪退 修改/usr/share/applications中的qqmusic.desktop&#xff0c;在Exec后加上 --no-sandbox,如下图所示&#xff1a; 该文件有可能是只读&#xff0c;权限不够的话用sudo vim qqmusic.desktop...

Vue+ElementUi实现录音播放上传及处理getUserMedia报错问题

1.Vue安装插件 npm install --registryhttps://registry.npmmirror.com 2.Vue页面使用 <template><div class"app-container"><!-- header --><el-header class"procedureHeader" style"height: 20px;"><el-divid…...

如何在Spring Boot中使用AOP

如何在Spring Boot中使用AOP 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨在Spring Boot中如何利用AOP&#xff08;Aspect-Oriented Programmi…...

第10章:Electron应用打包与分发

第10章&#xff1a;应用打包与分发 在完成Electron应用开发后&#xff0c;最后一步是将应用打包并分发给最终用户。本章将介绍如何使用Electron的打包工具将应用打包成可执行文件&#xff0c;并介绍常见的分发策略和工具。 10.1 使用Electron Forge Electron Forge是一个现代…...

【Linux进程】进程优先级 Linux 2.6内核进程的调度

前言 进程是资源分配的基本单位, 在OS中存在这很多的进程, 那么就必然存在着资源竞争的问题, 操作系统是如何进行资源分配的? 对于多个进程同时运行, 操作系统又是如何调度达到并发呢? 本文将以Linux kernel 2.6为例 , 向大家介绍进程在操作系统中 (OS) 的调度原理; 1. 进程优…...

依米康300249.SZ:长期为百度提供数据中心温控设备和部分微模块的施

:长期为百度提供数据中心温控设备和部分微模块的施工、安装等服务)格隆汇6月14日丨有投资者于投资者互动平台向依米康提问,“百度是公司的重要客户吗?公司与百度的合作主要是在哪方面呢?”,公司回复称,百度一直都是公司重要客户,公司长期为百度提供数据中心温控设备和部分…...

领克07EM-P正式上市,优惠价16.38万元起!

领克07 EM-P作为一款定位高端市场的混合动力车型,搭载的超级增程电动解决方案,不仅承载了年轻消费者对速度与激情的追求,更以高性价比满足了他们对燃油经济性和舒适性的双重需求。这一方案为驾驶者提供了四种不同的驾驶模式,包括纯电动模式、性能模式、超级增程模式以及个性…...

领克07EM-P诠释原创精神,助力行业向上发展

随着五月悄然而至,北京汽车车展如约召开,各大车企携手全新车型纷纷亮相。5月17日,中国原创汽车品牌领克为用户带来了新品,领克07 EM-P迎来上市。这意味着领克在高端电动轿车市场正式站稳脚跟,出色的产品魅力,也成为很多消费者的优质选择。此次发布会现场,领克07 EM-P共推…...

未来三年雷军和他的小米汽车首先不得不为生存而战

小米SU7正式上市,可谓红透了汽车界。雷军及小米汽车多个话题登上热搜,而大定的数据也映衬出小米SU7的热度。然而,在一片喧嚣声中,我倒觉得,未来三年雷军和他的小米汽车首先不得不为生存而战。未来三年小米汽车大概率将是亏损运营。从这次小米SU7的定价就可以看出端倪。小米…...

【Linux进程篇】Linux进程管理——进程创建与终止

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 目录 进程创建 fork函数初识 写时拷贝 fork常规用法 fork调用失败的原因 进程终止 进程退出场景 _exit函数 exit函数 return退出 进程创建 fork函数初识 在linux中fork函数时非常重要的函数&#xff0c;它从已…...

深入解析Web前端三大主流框架:Angular、React和Vue

Web前端三大主流框架分别是Angular、React和Vue。下面我将为您详细介绍这三大框架的特点和使用指南。 Angular 核心概念: 组件(Components): 组件是Angular应用的构建块,每个组件由一个带有装饰器的类、一个HTML模板、一个CSS样式表组成。组件通过输入(@Input)和输出(…...