Java_Swing程序设计

news2024/11/15 20:04:10

swing组件允许编程人员在跨平台时指定统一的外观和风格。

Swing组件通常被称为轻量级组件,

JFrame在程序中的语法格式:

JFrame jf=new JFrame(title);

Container container=jf.getContentPane();

jf:JFrame类的对象 container:Container类的对象。

JFrame类的常用构造方法包括以下两种形式:

 public JFrame()  创建一个初始不可见、没有标题的新窗体

public JFrame(String title) 在实例化该Frame对象时可以创建一个不可见但具有标题的窗体。

setVisible(true) 方法使窗体可见

setDefaultCloseOperation()方法关闭窗体。

DO_NOTHING_ON_CLOSE 什么都不做就将窗体关闭

DISPOSE_ON_CLOSE 代表任何注册监听程序对象后会自动隐藏并释放窗体

HIDE_ON_CLOSE 隐藏窗口的默认关闭

EXIT_ON_CLOSE 退出应用程序默认窗口关闭

JDialog窗体

JDialog窗体是Swing组件中的对话框,它继承了AWT组件中的Java.awt.Dialog类。

其功能是从一个窗体中弹出另一个窗体,在使用时也使用调用getContentPane()方法将窗体转换为容器,然后在容器中设置窗体的特性。

public JDialog() 创建一个没有标题和父窗体的对话框。

public JDialog(Frame f) : 创建一个指定父窗体的对话框,但该窗体没有标题。

public JDialog(Frame f, boolean model): 创建一个指定类型的对话框,并指定父窗体,但该窗体没有指定标题。

public JDialog(Frame f,boolean model): 创建一个指定类型的对话框,并指定父窗体,但该窗体没有指定标题。

public JDialog(Frame f,String title,boolean model):创建一个指定标题、窗体和模式的对话框。

JFrame类中的两种构造方法分别为无参的构造方法和有参的构造方法。

第一种形式的构造方法可以创建一个初始不可见、没有标题的新窗体,第二种形式的构造方法在实例化该JFrame对象时可以创建一个不可见但具有标题的窗体。

package Procedures;

import javax.swing.*;
import java.awt.*;

public class Example1 extends JFrame{
    public void CreateJFrame(String title){
        JFrame jf=new JFrame(title); //实例化一个JFrame对象
        Container container= jf.getContentPane(); //获取一个容器
        JLabel jl=new JLabel("这是一个JFrame窗体"); //创建一个JLable标签
        jl.setHorizontalAlignment(SwingConstants.CENTER); //使标签上的文字居中

        container.add(jl); //将标签添加到容器中
        container.setBackground(Color.white); //设置容器的背景颜色
        jf.setVisible(true); //使窗体可视
        jf.setSize(200,150); //设置窗体大小
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //设置窗体关闭方式
    }
    public static void main(String args[]){ //在主方法中调用CreateJFrame()方法
        new Example1().CreateJFrame("创建一个JFrame窗体");

    }

}

setSize(int x,int y)方法设置窗体大小,其中x,y代表窗体的宽与高。

创建窗体后,给予窗体一个关闭方式,可以调用setDefaultCloseOperation()方法。Java常用窗体关闭方法有以下4种。

DO_NOTHING_ON_CLOSE  代表什么都不做就将窗体关闭

DISPOSE_ON_CLOSE  任何注册监听程序对象后会自动隐藏并释放窗体

HIDE_ON_CLOSE  EXIT_ON_CLOSE 隐藏窗口的默认窗口关闭

EXIT_ON_CLOSE 退出应用程序默认窗口关闭

JDialog窗体

JDialog窗体是Swing组件中的对话框,他继承了AWT组件中的java.awt.Dialog类

JDialog窗体的功能是从一个窗体中弹出另一个窗体,它与JFrame窗体类似,在使用时也需要调用getContentPane()方法将窗体转换为容器,然后在容器中设置窗体的特性。

public JDialog(): 创建一个没有标题和父窗体的对话框。

public JDialog(Frame f):创建一个指定父窗体的对话框,但该窗体没有标题。

public JDialog(Frame f,boolean model):创建一个指定类型的对话框,并指定父窗体,但该窗体没有指定标题。

public JDialog(Frame f,String title):创建一个指定标题和父窗体的对话框。

public JDialog(Frame f,String title,boolean model):创建一个指定标题、窗体和模式的对话框)

标签组件与图标

在Swing中显示文本或提示信息的方法是使用标签,它支持文本字符串和图标。在应用程序的用户界面中,一个简短的文本标签可以使用户知道这些组件的目的,所以标签在Swing中是比较常用的组件。

标签的使用

标签由JLable类定义,它的父类为JComponent类。

标签可以显示一行只读文本、一个图像或带图像的文本,它并不能产生任何类型的事件,只是简单的显示文本和图片,但是可以使用标签的特性指定标签上文本的对其方式。

JLabel类提供了多种构造方法,可以创建多种标签,如显示只有文本的标签、只有图标的标签或包含文本与图标的标签。JLabel类常用的几个构造方法如下。

public JLabel(): 创建一个不带图标和文本的JLabel对象。

public JLabel(Icon icon): 创建一个带图标的JLabel对象。

public JLabel(Icon icon,int aligment): 创建一个带图标的JLabel对象,并设置图标水平对齐方式。

public JLabel(String text,int aligment): 创建一个带文本的JLabel对象,并设置文字水平对齐方式。

public JLabel(String text,Icon icon,int aligment): 创建一个带文本、带图标的JLabel对象,并设置标签内容的水平对齐方式。

图标的使用

Swing中的图标可以放置在按钮、标签等组件上,用于描述组件的用途。图标可以用Java支持的图片文件类型进行创建,也可以使用java.awt.Graphics类提供的功能方法来创建。

创建图表

在Swing中通过Icon接口来创建图标,可以在创建时给定图标的大小、颜色等特性。如果使用Icon接口,必须实现Icon接口中的3个方法:

public int  getIconHeight()

public int getIconWidth()

public void paintIcon(Component arg0,Graphics arg1,int arg2,int arg3)

getIconHeigth()与getIconWidth()方法用于获取图标的长与宽,paintIcon()方法用于实现在指定坐标位置画图。

public ImageIcon(): 该构造方法构建一个通用的ImageIcon对象,当真正需要设置图片时再使用ImageIcon对象调用setImage(Image image)方法;来操作。

public ImageIcon(Image image,String description): 除了可以从图片源创建图标之外,还可以为这个图标添加简短的描述,但这个描述不会在图标上显示,可以使用getDescripion()这个方法获取这个描述。

public ImageIcon(URL url):该构造方法利用位于计算机网络上的图像创建图标

常用布局管理器:

布局管理器提供了Swing组件安排、展示在容器中的方法及基本的布局功能。

Swing提供的常用布局管理器包括流布局管理器、边界布局管理器和网格布局管理器。

绝对布局:

在Swing中,除了使用布局管理器外还可以使用绝对布局。绝对布局,就是硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式来指定组件的位置。

使用绝对布局的步骤如下:

1.使用Container.setLayout(null)方法取消布局管理器。

2.使用Component.setBounds()方法设置每一个组件的大小与位置。

流布局管理器

流布局管理器是最基本的布局管理器,在整个容器中的布局正如其名,像流水一样从左到右摆放组件,直到占据这一行的所有空间。然后再向下移动一行,组件默认居中排列。

FlowLayout类中具有以下常用的构造方法:

public FlowLayout()

public FlowLayout(int alignment)

public FlowLayout(int aligment,int horizGap,int vertGrap)

alignment参数表示流布局管理器后组件在每一行的具体摆放位置。

FlowLayout.LEFT=0   行组件左对齐排列

FlowLayout.CENTER=1; 

FlowLayout.RIGHT=2; 行组件被指定为右对齐排列

horizFGap与vertGap两个参数分别以像素为单位指定组件之间的水平间隔与垂直间隔。

边界布局管理器

在默认不指定窗体布局的情况下,Swing组件的布局模式是边界布局管理器。

边界布局管理器的功能不止如此,边界布局管理器还可以将容器划分为东、南、西、北、中5个区域,可以将组件加入到者5个区域中。


import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class BorderLayoutPosition extends JFrame {
	//定义组件摆放位置的数组
	String[] border= {BorderLayout.CENTER,BorderLayout.NORTH,
			BorderLayout.SOUTH,BorderLayout.WEST,BorderLayout.EAST};
	String[] buttonName= {"center button","north button","south button","west button","east button"};
	public BorderLayoutPosition() {
		setTitle("这个窗体使用边界布局管理器");
		Container c=getContentPane(); //定义一个容器
		setLayout(new BorderLayout()); //设置容器为容器为边界布局管理器
		for(int i=0;i<border.length;i++) {
			//在容器中添加按钮,设置按钮布局
			c.add(border[i],new JButton(buttonName[i]));
		}
		setSize(350,200); //设置窗体大小
		setVisible(true); //设置窗体可见
		//设置窗体关闭方式
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	}
	public static void main(String[] args) {
		new BorderLayoutPosition();
		
	}

}

add()方法提供在容器中添加组件的功能,并同时设置组建的摆放位置。

网格布局管理器

网络布局管理器将容器划分为网格,所以组件可以按行和列进行排列。

在网格布局管理器中,每一个组件的大小都相同,并且网格中空格的个数由网格的行数和列数决定。

组件从网格的左上角开始,按照从左到右、从上到下的顺序加入到网格中,而且每一个组件都会填满整个网格,改变窗体的大小,组件的大小也会改变。

网格布局管理器主要有以下两个常用的构造方法:

public GridLayout(int rows,int columns)

public GridLayout(int rows,int columns,int horizGap,int vertGap)

rows与columns参数代表网格的行数与列数,这两个参数只有一个参数可以为0,代表一行或一列可以排列任意多个组件;参数horizGap与vertGap指定网格之间的距离,其中horizGap参数指定网格之间的水平距离,vertGap参数指定网络之间的垂直距离。

网格组布局管理器

由GridBagLayout类实现的布局管理器称为网格组布局管理器,

它实现了一个动态的矩形网格,可以根据实际需要随意增减矩形网格的行数和列数。

向GridBagLyout类管理的容器中添加组件时,需要为每个组件创建一个与之关联的GridBagConstants类的对象,通过该类的属性可以设置组件的布局信息。 

通过GridBagLayout类实现的矩形网格的绘制方向由容器决定。 如果容器的方向是从左到右,则位于矩形网格左上角的单元格的列索引为0,此时组件左上角的点为起始点;如果容器的方向是从右到左,则位于矩形网格右上角的单元格的列索引为0,此时组件右上角的点为起始点。

详细讲解GridBagLayout类中各个属性的功能和使用方法,以及在使用过程中需要注意的一些事项。

1.grid和gridy属性

这两个属性用来设置组件起始点所在单元格的索引值。需要注意的是,属性gridx设置的是x轴,所以它表示的是组件起始点所在列的索引;属性gridy设置的是Y轴的索引值,所以它表示的是组件起始点所在行的索引。     

     

gridwidth和gridheight属性

这两个属性用来设置组件占用网格组的行数和列数。属性gridwidth为组件占用网格组的列数,也可以理解为以单元格为单位组件的宽度:属性gridheight为组件占用网格组的行数,也可以理解为以单元格为单位组件的高度。

anchor属性

属性anchor用来设置组件在其所在显示区域的显示位置。通常将显示区域从方向上划分为9个方位。

fill属性

属性fill用来设置组件的填充方式。当单元格显示区域的面积大于组件面积,或者开一个组件占用多个单元格时,显示组件可能不必占用所有显示区域,在这种情况下可以通过fill属性设置组件的填充方式。可以利用4个静态常量设置该属性,默认情况下是将该属性设置为静态常量NONE,既不调整组件大小至填满显示区域;如果该属性设置为静态常量HORIZONTAL,表示只调整组件水平方向的大小(组件宽度)至填满显示区域;如果将该属性设置为静态常量VERTICAL,表示只调整组件垂直方向的大小(组件高度)至填满显示区域;如果将该属性设置为静态常量BOTH,则表示同时调整组件的宽度和高度至填满显示区域。

         inserts属性

属性insets用来设置组件四周与单元格边缘之间的最小距离。该属性的类型为Insets.Insets类仅有一个构造方法Insets(int top,int left,int bottom,int right),它的4个入口参数以此为组件上方、左侧、下方和右侧的最小距离,单位为像素。   

         ipadx和ipady属性

这两个属性用来修改组件的首选大小,属性ipadx用来修改组建的宽度,属性ipady用来修改组件的高度,如果为正数,则在首选大小的基础上增加指定的宽度和高度,如果为负数,则在首选大小的基础上减小指定的宽度和高度。 

weightx和weighty属性

这两个属性用来设置网格组的每一行和每一列对额外空间的分布方式。在不设置属性weightx和weighty的情况下,当窗体调整到足够大时,组件全部聚集在窗体的中央,在组件四周出现了大片的额外空间,为了避免,可以通过这两个属性设置网格组的每行每列对额外空间的分布方式。如果在该行中设置了多个weighty属性,则取它们的最大值为该行的分布方式。

在设置网格组的每一行和每一列对额外空间的分布方式时,建议只设置第一行的weightx属性和第一列的weighty属性,这样会方便前期调试和后期维护。

网格组的行和列对额外空间的分布方式完全相同,下面以网格组的行为为例详细讲解对额外空间的分布方式。网格组布局管理器首先计算出每一行的分布方式,即获取每一行的weighty属性的最大值,然后计算每个最大值占所有最大值总和的百分比,最后将额外空间的相应百分比分配给对应行。

在设置网格组的每一行和每一列对额外空间的分布方式时,建议为各个属性按百分比取值。

常用面板

面板也是一个Swing容器,它可以作为容器容纳其他组件,但它也必须被添加到其他容器中。Swing中常用的面板包括JPanel面板以及JScrollPane面板。

JPanel面板

JPanel面板可以聚集一些组件来布局。面板也是一种容器,因为它继承自java.awt.Container类。

JScrollPane面板

在设置面板时,可能会遇到在一个较小的容器窗体中显示一个较大部分的内容的情况,这时可以使用JScrllPane面板。此面板是带滚动条的面板,它也是一种容器,但是只能放置一个组件,并且不可以使用布局管理器。如果需要在JScrollPane面板中放置多个组件,需要将多个组件放置在JPanel面板上,然后将JPanel面板作为一个整体组件添加在JScrollPane组件上。

按钮组件

按钮在Swing组件中是较为常见的组件,用于触发特定动作。Swing中提供多种按钮,包括提交按钮、复选框、单选按钮等,这些按钮都是从AbstarctButon类中继承而来的。

提交按钮组件

Swing中的提交按钮(JButton)由JButton对象表示,其构造方法主要有以下几种方式:

public JButton()  //可以生成不带任何文本组件的对象和图标,能在以后使用相应方法为按钮设置指定的文本和图标

public JButton(String text) 

public JButton(Icon icon)

public JButton(String text,Icon icon)

通过使用上述构造方法,在Swing按钮上不仅能显示文本标签,还可以显示图标。

单选按钮组件

单选按钮(JRadioButton)显示一个圆形图标,并且在该图标旁放置一些说明性文字,而在应用程序中,一般将多个单选按钮放置在按钮组中,使这些单选按钮表现出某种功能,当用户选中某个单选按钮后,按钮中其他按钮将被自动取消。控制按钮的诸多方法都是从AbstractButton类中的方法

1.单选按钮

可以使用JRadioButton类中的构造方法创建单选按钮对象。常用构造方法如下:
public JRadioButton().。

public JRadioButton(Icon icon)。

public JRadioButton(Icon icon,boolean selected)。

public JRadioButton(String text)。

public JRadioButton(String text,Icon icon)。

public JRadioButton(String text,Icon icon,boolean selected)。

在初始化单选按钮时,可以同时设置单选按钮的图标、文字以及默认是否被选中等属性。

按钮组

在Swing中存在一个ButtonGroup类,用于产生按钮组,如果希望将所有的单选按钮放置在按钮组中,需要实例化一个JRadioButton对象,并使用该对象调用add()方法添加单选按钮。

JRadioButton jr1=new JRadioButton();
JRadioButton jr2=new JRadioButton();
JRadioBUtton jr3=new JRadioButton();
ButtonGroup group=new ButtonGroup();
group.add(jr1);
group.add(jr2);
group.add(jr2);
group.add(jr3);

复选框组件

复选框在Swing组件中的使用也非常广泛,它具有一个方块图标,外加一段描述性文字。与单选按钮唯一不同的是,复选框可以进行多选设置,每一个复选框都提供选中与不选中两种状态。

复选框用JCheckBox类对象表示

JcheckBox的常用构造方法如下:

public JCheckBox()

public JCheckBox(Icon icon,boolean checked)

public JCheckBox(String text,boolean checked)

列表组件

Swing中提供两种列表组件,分别为下拉列表框与列表框。下拉列表框与列表框都是带有一系列的项目的组件,用户可以从中选择需要的项目。列表框较下拉列表框更直观,他将所有的项目罗列在列表框中;但下拉列表框较列表框更为便捷、美观,他将所有的项目隐藏起来,当用户选用其中的项目时才显现出来。

下拉列表框组件

JComboBox类

Swing中的下拉列表框不仅可以供用户从中选择项目,也提供编辑项目中内容的功能。

下拉列表框是一个带条状的显示区,它具有下拉功能。在下拉列表框的右方存在一个倒三角形的按钮,当用户单击该按钮时,下拉列表框中的项目将会以列表形式显示出来。

Swing中的下拉列表框使用JComboBox类对象来表示,它是javax.swing.JComponent类的子类。它的常用构造方法如下:

public JComboBox()

public JComboBox(ComboBoxModeldataModel)

public JComboBox(Object[] arrayData)

public JComboBox(Vector vector)

在初始化下拉列表框时,可以选择同时下拉列表框中的项目内容,也可以在程序中使用其他方法设置下拉列表框中的内容。

JComboBox模型

在开发程序中,一般将下拉列表框中的项目封装为ComboBoxModel的情况比较多。ComboBoxModel为接口,它代表一般模型,可以自定义一个类实现该接口,然后再初始化JComboBoxModel接口类型,但是必须实现以下两种方法:

public void setSelectedItem(Object item)

public ObjectgetSelectedItem()

其中setSelectedItem()方法用于设置下拉列标框中的选中项,getSelectedItem()方法用于返回下拉列表框中的选中项。

getSize():返回列表的长度

getElementAt(int index):返回指定索引处的值

列表框组件

列表框与下拉列表框的区别不仅表现在外观上,当激活下拉列表框时,还会出现下拉列表框中的内容,;但列表框只是在窗体上占据固定的大小,如果需要列表框具有滚动效果,可以将列表框放入滚动面板中。

Swing中使用JList类对象来表示列表框,下面列举几个常用的构造方法。

public void JList()

public void JList(Object[] listData)

public void JList(Vector listData)

public void JList(ListModel dataModel)

存在一个没有此参数的构造方法,可以通过在初始化列表框后使用setListData()方法对列表框进行设置。设置的方式由3种类型,包括数组、Vector类型和ListModel没模型。

当使用数组作为构造方法的参数时,首先需要创建列表项目的数组,然后再利用构造方法来初始化列表框。

使用数组作为初始化列表框的参数

String contents={"列表1“,"列表2“,"列表3”,"列表4“};

JList jl=new JList(contents);

使用Vector类型数据作为初始化列表框的参数

Vector contents=new Vector();

JList jl=new JList(contents);

JList jl=new JList(contents);

contents.add("列表1”);

contents.add("列表2");

使用ListModel模型为参数,需要创建ListModel对象。ListModel是Swing包中的一个接口它提供了获取列表框属性的方法。通常情况下,为了使用户不完全实现ListModel接口中的方法,通常先自定义一个类继承实现该接口的抽象类AbstractListModel。在这个类中提供了getElementAt()与getSize()方法,其中getElementAt()方法代表根据项目的索引获取列表框中的值,而getSize()方法用于获取列表框中的项目个数。

public class JListTest extends JFrame {
	public JListTest() {
		Container cp=getContentPane();
		cp.setLayout(null);
		JList<String> jl=new JList<>(new MyListModel()); //JDK7新特性
		JScrollPane js=new JScrollPane(jl);
		
		js.setBounds(10,10,100,100);
		cp.add(js);
		setTitle("在这个窗体中使用了列表框");
		setSize(200,150);
		setVisible(true);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		
	}
	public static void main(String[] args) {
		JListTest a=new JListTest();
	}
}
class MyListModel extends AbstractListModel<String>{
	private static final long serialVersionUID=1L;
	private String[] contents= {"列表1","列表2","列表3","列表4","列表5","列表6"};
	public String getElementAt(int x) {
		if(x<contents.length) {
			return contents[x];
		       }
			else
				return null;
		
	}
	public int getSize() {
		return contents.length;
	}
}

       使用DefaultListModel类创建列表框,该类扩展了AbstractListModel类,也可以通过DefaultListModel对象向上转型为ListModel接口初始化列表框,同时DefaultListMoel类提供了addElement()方法实现将内容添加到列表框中。

使用DefaultListModel类创建列表框

final String[] flavors={"列表1","列表2","列表3","列表4","列表5","列表6"};
fianl DefaultListModel iItems=new DefaultListModel();
final JList Ist=new JList(Items); //实例化JList对象
for(int i=0;i<4;i++){
 iltems.addElement(flavors[i]); //为模型增加内容
}

         文本组件

文本组件在实际项目中使用最为广泛,尤其是文本框与密码框组件。通过文本组件可以很轻松的处理单行文字、多行文字、口令字段。

文本框组件

文本框用来显示或编辑一个单行文本,在Swing中通过java.swing.JTextField类对象创建,该类继承了javax.swing.text.JTextComponent类,下面列举了一些创建文本框常用的构造方法。

public JTextField()

public JTextField(String text)

public JTextField(int fieldeidth)

public JTextField(String text,int fieldwidth)

public JTextField(Document docModel,String text,int fieldWidth)

通过在初始化文本框时设置文本框的默认文字、文本框的长度。

密码框组件

  密码框与文本框的定义与用法基本相同,唯一不同的是密码框将用户输入的字符串以某种符号进行加密,密码框对象是通过javax.swing.JPasswordField类来创建的,JPasswordField类的构造方法与JTextField类的构造方法非常相似。

public JPasswordField()

public JPasswordField(String text)

public JPasswordField(int fieldwidth)

public JPasswordField(String text,int fieldwidth)

public JPasswordField(Document docModel,String text,int fieldWidth)

  在程序中定义密码框
JPasswordField jp=new JPasswordField(); jp.setEchoChar('#'); //设置回显字符

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

  文本域组件

Swing中任何一个文本区域都是JTextArea类型的对象。JTextArea常用的构造方法如下:

public JTextArea()

public JTexArea(String text)

public JTextArea(int rows,int columns)

public JTextArea(Document doc)

public JTextArea(Document doc,String Text,int rows,int columns)

上述构造方法可以在初始化文本域时提供默认文本以及文本域的长与宽     

JTextArea类中存在一个setLineWrap()方法,该方法用于设置文本域是否可以自动换行。如果将该方法的参数设置为true,文本域将自动换行,否则不自动换行。

常用事件监听器

监听事件简介

在Swing事件模型中由3个分离的对象完成对事件的处理,分别为事件源、事件以及监听程序。事件源触发一个事件,它被一个或多个“监听器"接收,监听器负责处理事件。

所谓事件监听器,实质上就是一个”实现特定类型监听器接口"的类对象。事件几乎都以对象来表示,它是某种事件类的对象,事件源(如按钮)会在用户做出相应的动作(如按钮被按下)时产生事件对象,如动作事件对应ActionEvent类对象,同时要编写一个监听器的类必须实现相应的接口,如ActionEvent类对应的是ActionListener接口,需要获取某个事件对象必须实现相应的接口,同时需要将接口中的方法一一实现。最后事件源(按钮)调用相应的方法加载这个"实现特定类型监听器接口"的类对象,所有的事件源都可以为组件添加或移除相应的事件监听器。

动作事件监听器

动作事件监听器是Swing中比较常用的事件监听器,很多组件的动作都会使用它监听,如按钮被单击。   

     

一般情况下,为事件源做监听事件应使用匿名类形式。

焦点事件监听器

焦点事件监听器在实际项目开发中应用也比较广泛,如将光标焦点离开一个文本框时需要弹出一个对话框,或将焦点返回给该文本框等。

                                            

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

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

相关文章

Flutter - Android 安卓 消息推送FireBase notification 手机状态栏图标不显示或 白板、白底问题。

一、问题&#xff1a; 使用flutterfirebase 开发进行消息推送时&#xff0c;安卓真机推送消息 状态栏的图标显示白色方块。 二、原因&#xff1a; 从Android 5.0&#xff08;Lollipop&#xff09;开始&#xff0c;随着Material Design的引入&#xff0c;Android的设计语言和U…

单因素方差分析--R

任务说明 三个剂量水平的药物处理受试者&#xff0c;每个剂量水平十个受试者&#xff0c;现在收集到数据后&#xff0c;问&#xff1a; 药物剂量水平显著影响受试者的response&#xff1f; 或者不同剂量药物处理受试者有显著效果的差异吗&#xff1f; 数据 library(tidyvers…

c JPEG编码,但有错误

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/videodev2.h> //v4l2 头文件 #include <strin…

3. SPSS数据文件的基本加工和处理

如何获取SPSS自带的案例数据文件&#xff1f; 首先找到SPSS的安装目录&#xff0c;然后找到Samples文件夹 可以看到有不同语言版本&#xff0c;选择简体中文 就能看到很多.sav文件 数据文件的整理 个案排序 单值排序 例&#xff1a;对于下面的数据集&#xff0c;将工资按…

拼多多API:从数据中挖掘商业价值的力量

随着大数据时代的来临&#xff0c;数据已经成为企业决策和创新的基石。拼多多API作为电商领域的重要接口&#xff0c;为企业提供了从数据中挖掘商业价值的机会。通过拼多多API&#xff0c;企业可以获取丰富的用户数据、商品数据和交易数据&#xff0c;从而深入了解市场需求、优…

【leetcode】字符串中的第一个唯一字符

题目描述 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 用例 示例 1&#xff1a; 输入: s “leetcode” 输出: 0 示例 2: 输入: s “loveleetcode” 输出: 2 示例 3: 输入: s “aabb”…

Flink CDC使用

Flink 环境准备 Flink 版本对应的CDC版本 两个jar包上传到flink bin目录下 flink-sql-connector-mysql-cdc mysql-connector-java 重启Flink集群

跟我学java|Stream流式编程——Stream 的中间操作

书接上回&#xff0c;继续研究。 过滤操作&#xff08;filter&#xff09; 过滤操作&#xff08;filter&#xff09;是 Stream API 中的一种常用操作方法&#xff0c;它接受一个 Predicate 函数作为参数&#xff0c;用于过滤 Stream 中的元素。只有满足 Predicate 条件的元素会…

搭建Windows版Redis集群

redis集群 Redis单机版安装 链接: Redis官网下载地址 下载完成后解压至指定目录 打开一个 cmd 窗口 使用 cd 命令切换目录到 E:\Redis\Redis 运行&#xff1a; redis-server.exe redis.windows.confRedis集群的安装 1.构建集群节点目录 创建一个redis-cluster目录用于存放…

计算机网络 - 路由器查表过程模拟 C++(2024)

1.题目描述 参考计算机网络教材 140 页 4.3 节内容&#xff0c;编程模拟路由器查找路由表的过程&#xff0c;用&#xff08;目的地址 掩码 下一跳&#xff09; 的 IP 路由表以及目的地址作为输入&#xff0c;为目的地址查找路由表&#xff0c;找出正确的下一跳并输出结果。 1.…

ATA-P系列功率放大器在压电叠堆中的作用是什么

功率放大器在压电叠堆中的作用是为压电叠堆提供足够的电能&#xff0c;使其产生强大的机械振动。以下为您详细介绍一下。 压电叠堆是一种利用压电效应产生振动的器件。通过在叠堆上施加电压&#xff0c;叠堆内部的压电材料会产生机械应变&#xff0c;从而引起叠堆的振动。这种振…

C++的一些书籍整理(个人学习)

UNIX环境高级编程&#xff08;第三版&#xff09; UNXI网络编程卷1 网络编程的笔记 收藏 我会了 一堆书 这个仓 数据库连接池原理介绍常用连接池介绍

7.3 CONSTANT MEMORY AND CACHING

掩模数组M在卷积中的使用方式有三个有趣的属性。首先&#xff0c;M阵列的大小通常很小。大多数卷积掩模在每个维度上都少于10个元素。即使在3D卷积的情况下&#xff0c;掩码通常也只包含少于1000个元素。其次&#xff0c;在内核执行过程中&#xff0c;M的内容不会改变。第三&am…

移动端对大批量图片加载的优化方法(三)

移动端对大批量图片加载的优化方法&#xff08;三&#xff09;Flutter 本篇主要从Flutter开发中可以使用到的对大批量图片加载的优化方法进行整理。 1.合适的图片格式 详情请参考移动端对大批量图片加载的优化方法&#xff08;一&#xff09;。 2.缓存机制 在Flutter中&am…

2023年山东省职业院校技能大赛高职组信息安全管理与评估—内存取证解析

内存取证 1、从内存中获取到用户admin的密码并且破解密码,以Flag{admin,password} 形式提交(密码为 6 位); volatility -f 1.vmem imageinfo 操作系统我们一般取第一个就可以了

vulhub中的Apache SSI 远程命令执行漏洞

Apache SSI 远程命令执行漏洞 1.cd到ssi-rce cd /opt/vulhub/httpd/ssi-rce/ 2.执行docker-compose up -d docker-compose up -d 3.查看靶场是否开启成功 dooker ps 拉取成功了 4.访问url 这里已经执行成功了&#xff0c;注意这里需要加入/upload.php 5.写入一句话木马 &…

Qt实现简单的分割窗口

最近在学习一些关于Qt的新知识&#xff0c;今天来讲述下我学习到的窗口分割&#xff0c;如果有不正确的&#xff0c;大家可以指正哦~ 首先&#xff0c;先看一下实现之后的简单效果吧&#xff01;省的说的天花乱坠&#xff0c;大家却不知道说的是哪个部分。 功能实现 整体demo…

阿里云RDMA通信库XRDMA论文详解

RDMA(remote direct memory access)即远端直接内存访问&#xff0c;是一种高性能网络通信技术&#xff0c;具有高带宽、低延迟、无CPU消耗等优点。RDMA相比TCP在性能方面有明显的优势&#xff0c;但在编程复杂度上RDMA verbs却比TCP socket复杂一个数量级。 开源社区和各大云厂…

如何在iOS手机上查看应用日志

引言 在开发iOS应用过程中&#xff0c;查看应用日志是非常重要的一项工作。通过查看日志&#xff0c;我们可以了解应用程序运行时的状态和错误信息&#xff0c;帮助我们进行调试和排查问题。本文将介绍两种方法来查看iOS手机上的应用日志&#xff0c;并提供相应的操作步骤。 …

Python学习之路——文件部分【书接上回】

一、书接上回 上个博客我说过&#xff0c;为什么最开始的时候一定要将文件内的中文的逗号替换为英文的逗号&#xff0c;接下来&#xff0c;请看&#xff08;其实想一想&#xff0c;感觉没必要&#xff0c;不过也是好的&#xff0c;总要练练手的嘛&#xff09; def func03(st…