淘宝客网站开发网站内部链接怎麽做

张小明 2026/1/10 5:31:05
淘宝客网站开发,网站内部链接怎麽做,手机网络,深圳网站搭建专业公司Swing 类库结构#xff08;这边建议边学边看这个图片就可以建立一定的思维导图#xff09; Swing 组件都采用 MVC#xff08;Model-View-Controller#xff0c;即模型-视图-控制器#xff09;的设计#xff0c;实现 GUI 组件的显示逻辑和数据逻辑的分离#xff0c;从而允…Swing 类库结构这边建议边学边看这个图片就可以建立一定的思维导图Swing 组件都采用 MVCModel-View-Controller即模型-视图-控制器的设计实现 GUI 组件的显示逻辑和数据逻辑的分离从而允许程序员自定义 Render 来改变 GUI 组件的显示外观以提供更多的灵活性。 Swing 围绕 JComponent 组件构建JComponent 则由 AWT 的容器类扩展而来。Swing 组织结构如图 1 所示。一.AWT布局管理(1)_awt_container容器_APIStudy01创建Frame窗口public static void main(String[] args) { //创建窗口对象 Frame framenew Frame(window测试); // 创建窗口大小位置 frame.setLocation(100,100); frame.setSize(500,300); //设置窗口对象可见 frame.setVisible(true); } }点击IDEA中的RUN你可以得到一下窗口界面。但是也有个问题我们需要手动在RUN中点掉暂停键我们没办法关闭右上角的’X’(取消窗口 。Study02创建Panel面板Panel是面板是一个很少直接使用的基本组件或者继承重写或者用来组织其他组件。panel和Jpanel都为中间层容器可显示文字、图像、绘制图形主要功能是在GUI中组织其他组件。public static void main(String[] args) { //1.创建一个window对象因为panel以及其他的容器都不能独立存在 //必须依靠window存在 Frame framenew Frame(); //2.创建一个Panel对象 Panel pnew Panel(); //3.创建一个文本框和按钮并且放入到Panel容器中 p.add(new TextField(测试文本)); p.add(new Button(这是一个测试按钮)); //4.把Pannel放入window中 frame.add(p); //5.设置window的位置以及大小 frame.setBounds(100,100,500,300); //6.设置window可见 frame.setVisible(true); }1.点击运行却又出现按钮中乱码现象。2. 此时由于我们用的是UTF-8故需要不让乱码出现则点击下方图片选项3. 点进去之后直接AltV在出现的VM options的方框里面添加这么一句话 4.-Dfile.encodinggbk5.然后再次运行即可。Study03创建滚动窗格public static void main(String[] args) { Frame framenew Frame(); //1.创建一个ScrollPane对象 ScrollPane spnew ScrollPane(ScrollPane.SCROLLBARS_ALWAYS); //---默认创建一个滚动条ScrollPane.SCROLLBARS_ALWAYS //2.往ScrollPane中添加内容 sp.add(new TextField(测试文本)); sp.add(new Button(测试按钮)); //3.把ScrollPane添加到Frame中 frame.add(sp); frame.setBounds(100,100,500,300); frame.setVisible(true); }1.当然你运行的时候还是会有乱码出现但问题不大直接参考Study02蓝色字体。2_awt_LayoutManger布局管理Study04(创建FlowLayoutpublic static void main(String[] args) { Frame frame new Frame(测试FlowLayout); //1.通过setLayout方法设置容器的布局管理器 //1)向左边对齐 frame.setLayout(new FlowLayout(FlowLayout.LEFT,20,20));//20为像素单位 //2)向中间对齐 frame.setLayout(new FlowLayout(FlowLayout.CENTER,20,20));//20为像素单位 //3)向右边对齐 frame.setLayout(new FlowLayout(FlowLayout.RIGHT, 40, 20));//20为像素单位 //2.添加多个按钮到frame中 for (int i 0; i 100; i) { frame.add(new Button(按钮 i)); } //3.设置最佳大小pack方法 frame.pack(); frame.setVisible(true); }输出样例向右的按钮输出Study05(创建BorderLayoutpublic static void main(String[] args) { Frame framenew Frame(这里测试BorderLayout); //1.给frame设置BorderLayout布局管理器 frame.setLayout(new BorderLayout(30,10)); //2.往frame的指定区域添加组件 frame.add(new Button(北侧按钮),BorderLayout.NORTH); frame.add(new Button(南侧按钮),BorderLayout.SOUTH); frame.add(new Button(东侧按钮),BorderLayout.EAST); frame.add(new Button(西侧按钮),BorderLayout.WEST); frame.add(new Button(中间按钮),BorderLayout.CENTER); frame.pack(); frame.setVisible(true); }输出样例Study06(中间区域放文本public static void main(String[] args) { Frame framenew Frame(这里测试BorderLayout); //1.给frame设置BorderLayout布局管理器 frame.setLayout(new BorderLayout(30,10)); //2.往frame的指定区域添加组件 frame.add(new Button(北侧按钮),BorderLayout.NORTH); frame.add(new Button(南侧按钮),BorderLayout.SOUTH); frame.add(new Button(中间按钮),BorderLayout.CENTER); frame.add(new TextField(测试文本)); frame.pack(); frame.setVisible(true); }输出样例1.但是这样的话会将中间按钮给覆盖掉了那么如何将按钮与测试文本共同放在中间且不互相干扰呢public static void main(String[] args) { Frame framenew Frame(这里测试BorderLayout); //1.给frame设置BorderLayout布局管理器 frame.setLayout(new BorderLayout(30,10)); //2.往frame的指定区域添加组件 frame.add(new Button(北侧按钮),BorderLayout.NORTH); frame.add(new Button(南侧按钮),BorderLayout.SOUTH); Panel pnew Panel(); p.add(new Button(中间按钮)); p.add(new TextField(测试文本框)); frame.add(p); frame.pack(); frame.setVisible(true); }输出样例Study07(创建GirdLayout如何做一个简单的计算器界面?public static void main(String[] args) { Frame frame new Frame(); //1、创建一个Panel对象里面存放一个TextFiled组件 Panel pnew Panel(); p.add(new TextField(30)); //2、把当前这个Panel添加到frame的北边区域 frame.add(p,BorderLayout.NORTH); //3、创建一个Panel对象并且设置他的布局管理器为GridLayout Panel p2new Panel(); p2.setLayout(new GridLayout(5,10,3,3)); //4.往Panel中添加内容 for(int i0;i10;i){ p2.add(new Button(i)); } p2.add(new Button()); p2.add(new Button(-)); p2.add(new Button(*)); p2.add(new Button(/)); p2.add(new Button(.)); //5.把当前Panel添加到frame中 frame.add(p2); frame.pack(); frame.setVisible(true); }输出样例Study08(创建CardLayout什么是CardLayout,CardLayout布局管理器以时间而非空间来管理它的组件它将容器的所有组件看成一叠卡片每个卡片其实就是一个组件每次只有最上面的Companent才可见。就好像一副扑克牌它们叠在一起每次只有最上面的一张扑克牌可见。方法名称方法功能CardLayout()创建默认的CardLayout布局管理器CardLayout(int hgap,int vgap)通过指定卡片与容器左右边界的间距上下边界间距来决定CardLayout的布局管理器first(Container target)显示target容器中的第一张卡片last(Container target)显示target容器中的最后一张卡片previou(Container target)显示target容器中前一张卡片next(Container target)显示target容器中的后一张卡片showContainer targetString name)显示target容器中指定名字的卡片public static void main(String[] args) { Frame framenew Frame(测试CardLayout); //1、创建一个Panel容器用来存储多张卡片 Panel p1new Panel(); //2、创建一个CardLayout对象并且把该对象设置给之前创建的Panel容器中 CardLayout cardLayoutnew CardLayout(); p1.setLayout(cardLayout); //3、往Panel中储存多个组织 String[] name{第一张,第二张,第三张,第四张,第五张}; for(int i0;iname.length;i){ p1.add(name[i],new Button(name[i])); } //4、把Panel放到frame中的中间区域 frame.add(p1); //5、创建另外一个panel p2用来存储多个按钮组件 Panel p2new Panel(); //6、创建5个按钮组件 Button b1 new Button(上一张); Button b2 new Button(下一张); Button b3 new Button(第一张); Button b4 new Button(最后一张); Button b5 new Button(第三张); //7、创建一个事件监听器监听按钮的点击动作 ActionListener listenernew ActionListener() { Override public void actionPerformed(ActionEvent e) { String actionCommand e.getActionCommand();//这个字符串其实就是按钮上的文字 switch (actionCommand){ case上一张: cardLayout.previous(p1); break; case下一张: cardLayout.next(p1); break; case第一张: cardLayout.first(p1); break; case最后一张: cardLayout.last(p1); break; case第三张: cardLayout.show(p1,第三张); break; } } }; //8、把当前这个时间监听器和多个按钮绑定到一起 b1.addActionListener(listener); b2.addActionListener(listener); b3.addActionListener(listener); b4.addActionListener(listener); b5.addActionListener(listener); //9、把按钮添加到容器p2中 p2.add(b1); p2.add(b2); p2.add(b3); p2.add(b4); p2.add(b5); //10、把p2放到frame的南边区域 frame.add(p2,BorderLayout.SOUTH); frame.pack(); frame.setVisible(true); }样例输出有点类似与windows中的图片浏览软件可以来回切换上下张图片。Study09(创建BoxLayout)方法名称方法功能BoxLayout(Container target,int axis)指定创建基于target容器的BoxLayout布局管理器该布局管理器里的组件按照axis方向排列。其中axis有BoxLayout.X_AXIS(横向和BoxLayout.Y_AXIS(纵向两个方向public static void main(String[] args) { Frame framenew Frame(); //1、基于frame容器创建一个BoxLayout对象并且该对象存放的组件是垂直存放 //BoxLayout boxLayout new BoxLayout(frame, BoxLayout.Y_AXIS); //------基于frame容器创建一个BoxLayout对象并且该对象存放的组件是水平存放 BoxLayout boxLayout new BoxLayout(frame, BoxLayout.X_AXIS); //2、把BoxLayout对象设置给Frame frame.setLayout(boxLayout); //3、往frame中添加两个按钮组件 frame.add(new Button(按钮1)); frame.add(new Button(按钮2)); frame.pack(); frame.setVisible(true); }样例输出水平方向的按钮样例输出垂直方向的按钮Study10(创建容器Box)在Java.swing中提供了一个新的容器Box,该容器的默认布局管理器就是BoxLayout大多数形况下Box容器去容纳多个GUI组件然后再把Box容器作为一个组件添加到其他的容器中从而形成窗口布局。方法名称方法功能static Box createHorizontalBox()创建一个水平排列组件的Box容器static Box creatVerticalBox()创建一个垂直排列组件的Box容器public static void main(String[] args) { Frame frame new Frame(测试BoxLayout); //1、创建一个水平排列组件的Box容器 Box hBox Box.createHorizontalBox(); //2、往当前容器中添加两个按钮 hBox.add(new Button(水平按钮1)); hBox.add(new Button(水平按钮2)); //3、创建一个垂直组件的Box容器 Box vBox Box.createVerticalBox(); //4、往当前容器中添加两个按钮 vBox.add(new Button(垂直按钮1)); vBox.add(new Button(垂直按钮2)); //5、把两个Box容器添加到FrameZ中展示 frame.add(hBox, BorderLayout.NORTH); frame.add(vBox); frame.pack(); frame.setVisible(true); }样例输出但是这样的排布中间没有空隙 那么怎么样让按钮之间有空隙呢public static void main(String[] args) { Frame frame new Frame(); //1、创建水平排列的Box容器 Box hbox Box.createHorizontalBox(); //2、往hBox容器中添加按钮还需要在多个按钮之间添加分割 hbox.add(new Button(水平按钮1)); hbox.add(Box.createHorizontalGlue());//该分割在两个方向上都可以拉伸 hbox.add(new Button(水平按钮2)); hbox.add(Box.createHorizontalStrut(30));//水平2与水平3之间不能拉伸固定死了 hbox.add(new Button(水平按钮3)); //3、创建垂直排列的Box容器 vBox Box vBox Box.createVerticalBox(); //4、往vBox容器中添加按钮还需要在多个按钮之间添加分割 vBox.add(new Button(垂直按钮1)); vBox.add(Box.createVerticalGlue());//该分割在两个方向上都可以拉伸 vBox.add(new Button(垂直按钮2)); vBox.add(Box.createVerticalStrut(30));//垂直按钮2与垂直按钮3之间是定死的无论你怎么拉伸都不变 vBox.add(new Button(垂直按钮3)); //5、把box容器中添加到frame中 frame.add(hbox, BorderLayout.NORTH); frame.add(vBox); frame.pack(); frame.setVisible(true); }样例输出二.AWT中常用的组件1_awt_常用基本组件Study11创建常用组件组件名功能Button按钮Canvas用于绘图的画布Checkbox复选框组件也可以当作单选框组件使用CheckboxGroup用于将多个Checkbox组件组合成一组一组Checkbox组件将有只有一个可以被选中即全部变成单选框组件Choice下拉选择框Frame窗口在GUI程序里面通过该类创建窗口Label标签类用于放置提示性文本List列表框组件可以添加多个项目Panel不能单独存在基本容器类必须放到其他容器当中Scrollbar滑动条组件如果用户输入位于某个范围的值就可以使用滑动条组件比如调色板中设置RGB的三个值所用的滑动条。当创建一个滑动条时必须指定它的方向、c初始值、滑块的大小、最小值以及最大值ScrollPane带水平及垂直滚动条的容器组件TextArea多行文本框TextField单行文本框1.如何利用上面组件组装成下面的例子public class day12 { //基本步骤创建基本组件 Frame frame new Frame(); TextArea te new TextArea(5, 20); Choice colorchoice new Choice(); CheckboxGroup cbg new CheckboxGroup(); Checkbox male new Checkbox(男, cbg, true); Checkbox female new Checkbox(女, cbg, false); Checkbox isMarried new Checkbox(是否已婚); TextField tf new TextField(20); Button ok new Button(确认); List colorList new List(6, true); public void init() { //1、组装界面 //2、组装底部 Box bBox Box.createHorizontalBox(); bBox.add(tf); bBox.add(ok); frame.add(bBox, BorderLayout.SOUTH); //3、组装 选择部分 colorchoice.add(蓝色); colorchoice.add(红色); colorchoice.add(绿色); Box cBox Box.createHorizontalBox(); cBox.add(colorchoice); cBox.add(male); cBox.add(female); cBox.add(isMarried); //4、组装文本域与选择部分 Box topLeft Box.createVerticalBox(); //-------组装文本区域 topLeft.add(te); //-------组装选择区域 topLeft.add(cBox); //5、组装顶部左边和列表框 colorList.add(蓝色); colorList.add(红色); colorList.add(绿色); Box top Box.createHorizontalBox(); top.add(topLeft); top.add(colorList); frame.add(top); //设置frame为最佳大小并且可见 frame.pack(); frame.setVisible(true); } public static void main(String[] args) { new day12().init();//调用init方法 } }1.首先将需要的组件列出来2.将需要的组件组装起来----由上图可知先用一个box将下面的确定按钮以及文本区域组装在一起并放在南边由于文本区域与确定按钮是水平的故用 Box.createHorizontalBox()方法组装为bBox ----其次组装选择颜色的功能由于也是与性别已婚水平的也用Box.createHorizontalBox()方法组装为cBox ----组装最大文本域以及颜色选择性别已婚由于二者是垂直关系故用Box.createVerticalBox()方法将其组装成topLeft ----最后例举colorlist需要放在最top盒子的右边那么再建造一个top盒子将topLeft放在左边colorlist放在右边二者水平关系用Box.createHorizontalBox()方法。Study12创建对话框DialogDialog是window类的子类是一个容器类属于特殊组件。对话框是可以独立存在的顶级窗口因此与普通窗口的用法几乎完全一样但是使用对话框需要注意下面两点对话框通常依赖其他窗口就是通常需要有一个父类窗口对话框有非模式和模式两种当某个模式对话框被打开后该模式对话框总是位于它的父窗口之上在模式对话框被关闭之前父窗口无法获得焦点。方法名称方法功能DialogFrame owner,String title,boolean modal)创建一个对话框对象onwer当前对话框的父窗口titile当前对话框的标题modal当前对话框是否为模式对话框1、什么是模式对话框模态对话框Modal Dialogue Box又叫做模式对话框是指**在用户想要对对话框以外的应用程序进行操作时必须首先对该对话框进行响应**。所以无法对对话框以外的应用程序进行操作。2、什么是非模式对话框**非模态对话框允许用户在处理非模态对话框的同时处理目标对话框。其实与上面的内容反之即可。**public static void main(String[] args) { Frame framenew Frame(); //1.创建两个对话框Dialog对象一个模式一个非模式 Dialog d1 new Dialog(frame, 模式对话框, true); Dialog d2new Dialog(frame,非模式对话框,false); //2、通过setBounds方法设置Dialog的位置与大小 d1.setBounds(20,30,300,200); d2.setBounds(20,30,300,200); //3、创建两个按钮 Button b1new Button(打开模式对话框); Button b2new Button(打开非模式对话框); //4、需要给这两个按钮添加点击后的行为AWT事件 b1.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent e) { d1.setVisible(true); } }); b2.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent e) { d2.setVisible(true); } }); //5、把按钮添加到frame中 frame.add(b1,BorderLayout.NORTH); frame.add(b2); frame.pack(); frame.setVisible(true); }3、但是如何添加组件到对话框里面去呢其实很简单只需要将基本组件装到Box中在将Box中的对象添加到对话框即可。public static void main(String[] args) { Frame framenew Frame(); //1.创建两个对话框Dialog对象一个模式一个非模式 Dialog d1 new Dialog(frame, 模式对话框, true); //-----创建一个垂直的Box容器把一个文本框以及确定按钮放在Box容器中 Box vboxBox.createVerticalBox(); vbox.add(new TextField(20)); vbox.add(new Button(确认)); //-----将vbox放在d1中去 d1.add(vbox); //2、通过setBounds方法设置Dialog的位置与大小 d1.setBounds(20,30,300,200); //3、创建两个按钮 Button b1new Button(打开模式对话框); //4、需要给这两个按钮添加点击后的行为AWT事件 b1.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent e) { d1.setVisible(true); } }); //5、把按钮添加到frame中 frame.add(b1,BorderLayout.NORTH); frame.pack(); frame.setVisible(true); }Study13创建对话框FileDialogDialog类中还有一个子类FileDialog它代表一个文件对话框用于打开或者保存文件需要注意的是FileDialog无法指定模态还是非模态这是因为FileDialog依赖于运行平台的实现如果运行平台的为文件对话框是模态的那么FileDialog也是模态的否则就是非模态的。方法名称方法功能FileDialog(Frame parent,String title.int mode)创建一个文件对话框parent指定父窗口title对话框标题mode文件对话框类型如果指定为FileDialog.LOAD,用于打开文件如果指定为FileDialog.SAVE,用于保存文件String getDirectory()获取被打开或保存文件的绝对路径String getFile()获取被打开或保存文件的文件名public static void main(String[] args) { Frame frame new Frame(); //1、创建两个FileDialog对象 FileDialog fileDialog new FileDialog(frame, 选择要打开的文件, FileDialog.LOAD); FileDialog fileDialog1 new FileDialog(frame, 选择要保存的文件, FileDialog.SAVE); //2、创建两个按钮 Button b1 new Button(打开文件); Button b2 new Button(保存文件); //3、给这两个按钮设置点击后的行为获取打开或者保存的路径文件名 b1.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent e) { fileDialog.setVisible(true);//代码会阻塞到这里 //获取选择的路径及文件 String directory fileDialog.getDirectory(); String file fileDialog.getFile(); System.out.println(打开的文件路径为 directory); System.out.println(打开的文件名称为 file); } }); b2.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent e) { fileDialog1.setVisible(true); //获取选择的路径及文件 String directory fileDialog1.getDirectory(); String file fileDialog1.getFile(); System.out.println(打开的文件路径为 directory); System.out.println(打开的文件名称为 file); } }); //4、把按钮添加到Frame中 frame.add(b1, BorderLayout.NORTH); frame.add(b2); frame.pack(); frame.setVisible(true); }样例输出Study14创建事件处理1定义:当在某个组件上发生某些操作的时候,会自动的触发-段代码的执行。2在GUI事件处理机制中涉及到4个重要的概念需要理解:事件源(Event Source):操作发生的场所,通常指某个组件,例如按钮、窗口等;事件( Event): 在事件源上发生的操作可以叫做事件, GUI会把事件都封装到一个Event对象中 ,如果需要知道该事件的详细信息,就可以通过Event对象来获取。事件监听器(Event Listener):当在某个事件源上发生了某个事件,事件监听器就可以对这个事件进行处理。注册监听:把某个事件监听器(A)通过某个事件(B)绑定到某个事件源©上,当在事件源C上发生了事件B之后,那么事件监听器A的代码就会自动执行。了解了上面机制那么要如何实现下面图片呢点击确定会有hello world出现--------------public class day15 { Frame framenew Frame(); TextField tf new TextField(30); Button ok new Button(确定); public void init(){ //组装视图 //监听器 //MyListener myListenernew MyListener(); //注册监听 ok.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent e) { tf.setText(hello world); } }); //把tf和ok放到Frame中 frame.add(tf,BorderLayout.NORTH); frame.add(ok); frame.pack(); frame.setVisible(true); } // private class MyListener implements ActionListener { // // Override // public void actionPerformed(ActionEvent e) { // tf.setText(hello world); // } // } public static void main(String[] args) { new day15().init(); }Study15(常见事件和事件监听器)事件监听器必须实现事件监听器接口AWT提供了大量的事件监听器接口用于实现不同类型的事件监听器,用于监听不同类型的事件。AWT中提供了丰高的事件类,用于封装不同组件上所发生的特定操作, AWT的事件类都是AWTEvent类的子类AWTEvent是EventObject的子类。1、AWT把事件分为了两大类:1低级事件这类事件是基于某个特定动作的事件。比如进入。点击、拖放等动作的鼠标事件,再比如得到焦点和失去焦点等焦点事件。事件触发时机ComponentEvent组件事件当组件尺寸发生变化、位置发生移动、显示/陶藏状态发生改变时触发该事件。ContainerEvent容器事件当容器里发生添加组件、删除组件时触发该事件。WindowEvent窗口事件当窗口状态发生改变(如打开、关闭。最大化、最小化)时触发该事件。FocusEvent焦点事件当组件得到焦点或失去焦点时触发该事件。KeyEvent键盘事件当按键被按下、松开、单击时触发该事件。MouseEvent鼠标事件,当进行单击、按下、松开、移动鼠标等动作时触发该事件。PaintEvent组件绘制事件。该事件是一个特殊的事件类型 当GUI组件调用update/paint方法来呈现自身时触发该事件,该事件并非专用于事件处理模型。2高级事件:这类事件并不会基于某个特定动作,而是根据功能含义定义的事件。事件触发时机ActionEvent动作事件当按钮、菜单项被单击在TextField中按Enter键时触发。AjustmentEvent调节事件,在滑动条上移动滑块以调节数值时触发该事件。ItemEvent选项事件,当用户选中某项或取消选中某项时触发该事件。TextEvent文本事件当文本框、文本域里的文本发生改变时触发该事件。2、事件监听器不同的事件需要使用不同的监听器监听,不同的监听器需要实现不同的监听器接口当指定事件发生后事件监听器就会调用所包含的事件处理器(实例方法)来处理事件。3、案例一public static void main(String[] args) { Frame framenew Frame(测试监听器); //创建组件事件源 TextField tfnew TextField(); Choice namesnew Choice(); names.add(刘岩); names.add(舒淇); names.add(闫妮); //给文本添加TextListener,监听内容变化 tf.addTextListener(new TextListener() { Override public void textValueChanged(TextEvent e) { String text tf.getText(); System.out.println(当前文本的内容为text); } }); //给下拉选择框添加ItemListener监听条目选项的变化 names.addItemListener(new ItemListener() { Override public void itemStateChanged(ItemEvent e) { Object item e.getItem(); System.out.println(当前选中的条目为item); } }); //给frame注册ContainerListener监听器监听容器组件的添加 frame.addContainerListener(new ContainerListener() { Override public void componentAdded(ContainerEvent e) {//添加方法 Component child e.getChild(); System.out.println(frame中添加了child); } Override public void componentRemoved(ContainerEvent e) {//移除方法 } }); //添加到frame中 Box hBoxBox.createHorizontalBox(); hBox.add(names); hBox.add(tf); frame.add(hBox); //设置frame最佳大小并可见 frame.pack(); frame.setVisible(true); }样例输出每次点击都会记录下监听内容4、 案例二如何关闭右上角x键public static void main(String[] args) { Frame framenew Frame(测试WindowListener); frame.setBounds(200,200,500,300); //设置WindowListener,监听用户点击右上角X的动作则关闭窗口 frame.addWindowListener(new WindowAdapter() { Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setVisible(true); }样例输出Study16(创建菜单组件)前面讲了GUI界面的构建其实就是把一些GUI的组件按照一定的布局放在容器即可。在实际开发中除了主界面还有一类比较重要的内容就是菜单相关组件可以通过菜单相关组件很方便的使用特定的功能在AWT中菜单组件的使用和之前学习的组件时一模一样的只需要把菜单条、菜单、菜单项组合在一起按照一定的布局放入到容器中即可。菜单组件名称功能MenuBar菜单条菜单的容器Menu菜单组件菜单项的容器。它也是MenuItem的子类所以可作为菜单项使用PopupMenu菜单项组件MenuItem菜单项组件CheckboxMenuItem复选框菜单项组件菜单相关组件使用1、准备菜单项组件这些组件可以是MenuItem及子类对象 2、准备菜单组件Menu或者PopupMenu右击弹出子菜单把第一步中准备好的菜单项组件添加进来 3、准备菜单条组件MenuBar把第二步准备好的菜单组件Menu添加进来 4、把第三步中准备好的菜单条组件添加到窗口对象中显示小技巧1、如果要在某个菜单的菜单项之间添加分割线那么只需要调用Menu的add(new MenuItem(-))即可。 2、如果要给某个菜单项关联快捷键功能那么只需要在创建菜单项对象设置即可例如给菜单项关联ctrlshiftQ快捷键只需要:new MenuItem(菜单项名字new MenuShortcut(KeyEvent.VK\_Q,true);案例一如何做出下图呢--------------public class day18 { //创建窗口 private Frame frame new Frame(); //创建菜单条 MenuBar menuBar new MenuBar(); //创建菜单组件 Menu fileMenu new Menu(文件); Menu editMenu new Menu(编辑); Menu formatMenu new Menu(格式); //菜单项组件 MenuItem auto new MenuItem(菜单换行); MenuItem copy new MenuItem(复制); MenuItem paste new MenuItem(粘贴); //关联快捷键 MenuItem comment new MenuItem(注释, new MenuShortcut(KeyEvent.VK_Q, true)); MenuItem canceComment new MenuItem(取消注释); TextArea ta new TextArea(6,40); public void init() { //组装视图 comment.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent e) { //在监听器下e.getActionCommand()点击后最后都返回注释功能 ta.append(您点击菜单项 e.getActionCommand()\n); } }); formatMenu.add(comment); formatMenu.add(canceComment); //组装编辑菜单 editMenu.add(auto); editMenu.add(copy); editMenu.add(paste); editMenu.add(formatMenu); //组装菜单条 menuBar.add(fileMenu); menuBar.add(editMenu); //把菜单条放入到Frame中 frame.setMenuBar(menuBar); frame.add(ta); //设置frame最佳大小 frame.pack(); frame.setVisible(true); } public static void main(String[] args) { new day18().init();案例二通过PopupMenu实现下图效果实现思路1、创建PopupMenu菜单组件2、创建多个MenuItem菜单项并添加到PopupMenu中3、将PopupMenu添加到目标组件中4、为需要右击出现PopupMenu菜单的组件注册鼠标监听事件当监听到用户释放右键时弹出菜单。public class day19 { private Frame framenew Frame(这里测试PopupMenu); //创建文本域 TextArea tanew TextArea(我爱中华,6,40); //创建Panel容器 Panel pnew Panel(); //创建PopupMenu PopupMenu popupMenunew PopupMenu(); //创建菜单项 MenuItem commentnew MenuItem(注释); MenuItem cancalcommentnew MenuItem(取消注释); MenuItem copynew MenuItem(复制); MenuItem savenew MenuItem(保存); public void init(){ //组装视图 ActionListener listenernew ActionListener() { Override public void actionPerformed(ActionEvent e) { String actionCommand e.getActionCommand(); ta.append(您点击了右键actionCommand\n); } }; //传入监听器 comment.addActionListener(listener); cancalcomment.addActionListener(listener); copy.addActionListener(listener); save.addActionListener(listener); //将功能放到popupMenu当中去 popupMenu.add(comment); popupMenu.add(cancalcomment); popupMenu.add(copy); popupMenu.add(save); //将popupMenu放到面板中Panel中去 p.add(popupMenu); //设置Panel的大小 p.setPreferredSize(new Dimension(40,100)); //给Panel注册鼠标事件监听用户释放鼠标的动作展示菜单 p.addMouseListener(new MouseAdapter() { Override public void mouseReleased(MouseEvent e) { //isPopupTrigger()用来判断是否为鼠标右键点击 boolean flag e.isPopupTrigger(); if(flag){ //显示popupMenu popupMenu.show(p,e.getX(),e.getY()); } } }); frame.add(ta); frame.add(p,BorderLayout.SOUTH); //设置frame最佳大小并可视化 frame.pack(); frame.setVisible(true); } public static void main(String[] args) { new day19().init(); } }Study17(绘图)很多程序如各种游戏需要在窗口中绘制各种图形除此之外及时要开发JavaEE项目时有时候也必须动态地向客户端生成各种图形、图标比如图形验证码、统计图等这都需要利用AWT地绘图功能。组件绘图原理之前我们已经学习很多组件如Button、Frame、Checkbox等等不同的组件展示出来的图形都不一样其实这些组件展示出来的图形其本质就是用AWT的绘图完成。 在AWT中真正提供绘图功能的是Graphics对象那么Component组件和Graphics对象存在什么关系才能让Component绘制呢在Component类中提供了下列三个方法来完成组件图案的绘制于刷新 paint(Graphics g):绘制组件的外观 update(Graphics g):内部调用paint方法刷新组件外观 repaint():调用update方法刷新组件外观一般情况下update和paint方法是由AWT系统负责调用如果程序要希望系统重新绘制组件可以调用repaint方法完成。1、Graphics对象的使用实际生活中如果需要画图首先我们得准备一张纸然后在拿一支笔配和一些颜色就可以在纸上画出来各种各样的图形例如圆形、矩形等等。 程序绘图也一样也需要画布画笔颜料等等。AWT中提供了Canvas类充当画布提供Graphics类来充当画笔通过调用Graphics对象的setColor()方法可以给画笔设置颜色。2、画图的步骤1.自定义类继承Canvas类重写paint(Graphics g)方法完成画图。 2.在paint方法内部真正开始画图之前调用Graphics对象的setColor()、setFont()等方法设置画笔的颜色字体等属性 3.调用Graphics画笔的drawXxx()方法开始画图。 其实画图的核心就在使用Graphics画笔在Canvas画布上画出什么颜色、什么样式的图形什么样式的图形所以核心在画笔上下表中列出了Graphics类中常用的一些方法方法名称方法功能setColor(Color c)设置颜色setFont(Font font)设置字体drawLine()绘制直线drawRect()绘制矩形drawRoundRect()绘制圆角矩形drawOval()绘制椭圆形drawPolygon()绘制多边形drawArc()绘制圆弧drawPolyline绘制折线fileRect()填充圆角矩形区域fillRoundRect()填充圆角矩形区域fillOval()填充椭圆区域fillPolygon()填充多边形区域fillArc()填充圆弧对应的扇形区域drawImage()绘制位图3、案例一按钮点击成图像------------------public class day20 { //定义一个RECT_SHAPE以及OVAL_SHAPE当点击按钮的时候监听器打开将二者分别进行赋值操作 private final String RECT_SHAPE reat; private final String OVAL_SHAPE oval; private Frame frame new Frame(测试绘图); Button butreat new Button(绘制矩形); Button butoval new Button(绘制椭圆); //定义一个变量记录当前要绘制椭圆还是矩形 private String shape ; //1、自定义类继承Canvas重写paint(Graphics g)方法完成画图 private class Mycnvas extends Canvas { Override public void paint(Graphics g) { //绘制不同的图形 if (shape.equals(RECT_SHAPE)) { //绘制矩形 g.setColor(Color.BLACK);//设置当前画笔的颜色 g.drawRect(100, 100, 150, 100); } else if (shape.equals(OVAL_SHAPE)) { //绘制椭圆 g.setColor(Color.RED); g.drawOval(100, 100, 150, 100); } } } //创建自定义的画布对象 Mycnvas drawArea new Mycnvas(); public void init() { //当我点击绘制矩形的时候就会执行监听器代码 butreat.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent e) { //将定义的RECT_SHAPE赋值给shape shape RECT_SHAPE; //并且在画布中repaint() drawArea.repaint(); } }); //当我点击绘制椭圆的时候就会执行监听器代码 butoval.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent e) { //将定义的OVAL_SHAPE赋值给shape shape OVAL_SHAPE; drawArea.repaint(); } }); //创建Panel承载按钮 Panel p new Panel(); p.add(butoval); p.add(butreat); frame.add(p, BorderLayout.SOUTH); //drawArea的大小需要设置 drawArea.setPreferredSize(new Dimension(300, 300)); frame.add(drawArea); //frame自适应 frame.pack(); frame.setVisible(true); } public static void main(String[] args) { new day20().init(); } }4、案例二弹射小球 (非常有意思建议自己手动敲一遍理解原理Java也可以用来开发一些动画。所谓动画就是间隔一定的时间通常小于0.1秒重新绘制的图形两次绘制的图像之间差异比较小肉眼看起来就成为所谓的动画。 为了实现间隔一定的时间就重新调用组件的repain方法可以借助Swing提供的Timer类Timer类是一个定时器它有如下一个构造器 **Timer(int delay,ActionListener)**每间隔delay毫秒系统自动触发ActionLinster监听器的事件处理器的方法在方法内部我们就可以调用组件的repaint方法完成组件重新绘制。----------package javaswing; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class day21 { private Frame frame new Frame(弹球游戏); //设置桌面宽度 private final int TABLE_WIDTH 300; //设置桌面高度 private final int TABLE_HEIGHT 400; //球拍的高度和宽度 private final int RACKET_WIDTH 60; private final int RACKET_HEIGHT 20; //小球的大小 private final int BALL_SIZE 16; //定义变量记录小球的坐标 private int ballX 120; private int ballY 20; //定义变量记录小球在x和y方向上分别移动的速度 private int speedY 10; private int speedX 5; //定义变量记录球拍的坐标 private int racketX 120; private final int racketY 340;//y坐标固定不变的只会在左右移动 //定义变量标识当前游戏是否结束 private boolean isOver false; //声明一个定时器 private Timer timer; //自定义一个类继承canvas充当画布 private class Mycanvas extends Canvas { //记得重写paint Override public void paint(Graphics g) { //TODO 在这里绘制内容 if (isOver) { //游戏结束的内容 g.setColor(Color.RED); g.setFont(new Font(Times, Font.BOLD, 30)); g.drawString(游戏结束, 50, 200); } else { //游戏进行的内容 //绘制小球 g.setColor(Color.BLUE); g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE); //绘制球拍 g.setColor(Color.PINK); g.fillRect(racketX, racketY, RACKET_WIDTH, RACKET_HEIGHT); } } } //创建绘画区域 Mycanvas drawArea new Mycanvas(); //组件组装方法 public void init() { //组装视图以及游戏逻辑的控制 //-----球拍的控制逻辑 //-----小球的控制逻辑 //完成球拍坐标的变化创建监听器按键事件键盘事件 KeyListener listener new KeyAdapter() { Override public void keyPressed(KeyEvent e) { //获取当前按下的键 int keyCode e.getKeyCode();//我们的键盘每一个键位都对应一个整数keycode if (keyCode KeyEvent.VK_LEFT) { //应该向左移动 if (racketX 0) { racketX - 10; } } if (keyCode KeyEvent.VK_RIGHT) { //应该向右移动 if (racketX (TABLE_WIDTH - RACKET_WIDTH)) { racketX 10; } } } }; //给frame和drawArea注册监听器 frame.addKeyListener(listener); drawArea.addKeyListener(listener); //小球坐标的控制 ActionListener task new ActionListener() { Override public void actionPerformed(ActionEvent e) { //更新小球的坐标重绘界面 //根据边界范围修正速度 //-----修正x轴弹出碰到边界的方向 if (ballX 0 || ballX (TABLE_WIDTH - BALL_SIZE)) { speedX -speedX; } //-----修正y轴弹出碰到边界的方向 if (ballY 0 || ballY racketY - BALL_SIZE ballX racketX ballX racketX RACKET_WIDTH) { speedY -speedY; } //-----超出球拍往下游戏结束 if (ballY racketY - BALL_SIZE (ballX racketX || ballX racketX RACKET_WIDTH)) { //当前小球超出了球拍范围 //停止定时器 timer.stop(); //修改游戏是否结束标记 isOver true; //重新绘制界面 drawArea.repaint(); } ballX speedX; ballY speedY; //重新绘制界面 drawArea.repaint(); } }; //这里需要手动导包import javax.swing.Timer.*; timer new Timer(100, task); timer.start(); drawArea.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT)); frame.add(drawArea); //frame窗口关闭 frame.addWindowListener(new WindowAdapter() { Override public void windowClosing(WindowEvent e) { System.exit(0); } }); //frame最佳大小 frame.pack(); frame.setVisible(true); } public static void main(String[] args) { new day21().init(); }Study18处理位图**如果仅仅绘制一些简单的几何图形程序的图形依旧十分简单。AWT允许在组件上绘制位图Graphics提供了drawmage(Image image)方法用于绘制位图该方法需要一个Image参数一一代表位图通过该方法就可以绘制出指定的位图。**位图使用步骤1、创建Image的子类对象BufferedImage(int width,int heigth,int ImageType),创建时需要指定位图的宽高及类型属性此时相当于在内存中生成了一张图片2、调用BufferedImage对象的getGraphics()方法获取画笔此时就可以往内存中的这张图片上绘图了绘图的方法和之前学习的一样。3、调用组件paint()方法中提供的Graphics对象的drawImage()方法一次性的内存中的图片BufferedImage绘制到待定的组件上。使用位图绘制组件的好处使用位图来绘制组件相当于实现了图的缓冲区此时绘图时没有直接把图形绘制到组件上而是先绘制到内存中的BufferedImage上等全部绘制完成后再一次性的图像显示到组件上即可这样用户的体验会好很多。案例绘画不精望谅解重点是drawArea.addMouseMotionListener与drawArea.addMouseListener的区别我就是在这里踩坑的。drawArea.addMouseMotionListener指的是按下鼠标移动的drawArea.addMouseListener值的是不移动鼠标的public class day22 { private Frame frame new Frame(简单绘图工具); //定义画图区域的宽高 private final int AREA_WIDTH 500; private final int AREA_HEIGHT 400; //定义一个右键菜单用于设置画笔的颜色PopupMenu为鼠标右击 private PopupMenu colorMenu new PopupMenu(); private MenuItem reditem new MenuItem(红色); private MenuItem buleitem new MenuItem(蓝色); private MenuItem greenitem new MenuItem(绿色); //定义一个变量记录当前画笔的颜色 private Color forceColor Color.BLACK; //创建一个BufferImage位图对象 BufferedImage image new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_RGB); //通过位图获取关联的Graphics对象 Graphics g image.getGraphics(); //自定义一个类继承Canvas private class MyCanvas extends Canvas { Override public void paint(Graphics g) { g.drawImage(image, 0, 0, null); } } //取自定义类中对象drawArea绘图区域 MyCanvas drawArea new MyCanvas(); //定义一个变量记录鼠标在拖动过程中上一次所处的坐标 private int preX -1; private int preY -1; //组装方法 public void init() { //组装视图逻辑控制 ActionListener actionListener new ActionListener() { Override public void actionPerformed(ActionEvent e) { //e.getActionCommand()获取的是new MenuItem(红色)中的“红色” String actionCommand e.getActionCommand(); switch (actionCommand) { case 红色: forceColor Color.RED; break; case 蓝色: forceColor Color.BLUE; break; case 绿色: forceColor Color.GREEN; break; } } }; //将按钮添加监听器并使之进行监听 reditem.addActionListener(actionListener); buleitem.addActionListener(actionListener); greenitem.addActionListener(actionListener); //colorMenu colorMenu.add(reditem); colorMenu.add(buleitem); colorMenu.add(greenitem); //把colorMenu放在绘图区域 drawArea.add(colorMenu); drawArea.addMouseListener(new MouseAdapter() { Override public void mouseReleased(MouseEvent e) {//当鼠标抬起时被调用 boolean popupTrigger e.isPopupTrigger(); if (popupTrigger) { //将colorMenu在drawArea展现出来鼠标点击的x与y轴位置 colorMenu.show(drawArea, e.getX(), e.getY()); } } }); //设置位图背景为白色 g.setColor(Color.white); g.fillRect(0, 0, AREA_WIDTH, AREA_HEIGHT); //通过监听鼠标的移动完成线条绘制 drawArea.addMouseMotionListener(new MouseMotionAdapter() { Override public void mouseDragged(MouseEvent e) { if (preX ! -1 preY ! -1) { g.setColor(forceColor); //画线条,需要两组坐标分别代表起点与终点e.getX(),e.getY()可以获取坐标 g.drawLine(preX, preY, e.getX(), e.getY()); } //修正preX与preY的值 preX e.getX(); preY e.getY(); //重绘组件 drawArea.repaint(); } }); drawArea.addMouseListener(new MouseAdapter() { Override public void mouseReleased(MouseEvent e) { //重置preX和preY preX -1; preY -1; } }); //将绘画区域设置为最合适的区域 drawArea.setPreferredSize(new Dimension(AREA_WIDTH, AREA_HEIGHT)); frame.add(drawArea); //设置frame最佳大小并可见 frame.pack(); frame.setVisible(true); } public static void main(String[] args) { new day22().init(); } }Study19 ImageIO的使用在实际生活中很多软件都支持打开本地磁盘已经存在的图片进行编辑编辑完毕后再重新保存到本地磁盘。如果使用AWT要完成这样的功能那么需要使用到ImageIO类可以操作本地磁盘的图片文件。方法名称方法功能static BufferedImage read(File input)读取本地磁盘图片文件static BufferedImage read(InputStream input)读取本地磁盘图片文件static boolean write(RenderedImage im,String formatName,File output)往本地磁盘中输出图片文件案例一制作图片查看器package javaswing; import javax.imageio.ImageIO; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class day23 { private Frame frame new Frame(图片查看器); //创建菜单条 MenuBar menuBar new MenuBar(); //创建菜单 Menu menu new Menu(文件); //创建菜单中的菜单名 MenuItem open new MenuItem(打开); MenuItem save new MenuItem(另存为); //声明BufferImage对象记录本地存取到内存的图片到最后读入文件直接赋值给image BufferedImage image; private class MyCanvas extends Canvas { Override public void paint(Graphics g) { g.drawImage(image, 0, 0, null); } } MyCanvas drawArea new MyCanvas(); public void init() { //组装视图 open.addActionListener(e - { //打开一个文件对话框 FileDialog fileDialog new FileDialog(frame, 打开图片, FileDialog.LOAD); fileDialog.setVisible(true); //获取用户选择的图片路径以及名称 String dir fileDialog.getDirectory(); String fileName fileDialog.getFile(); try { //记得这里要写IO读入的文件并且赋值给image image ImageIO.read(new File(dir, fileName)); drawArea.repaint(); } catch (IOException ex) { ex.printStackTrace(); } }); save.addActionListener(e - { //获取用户设置的保存路径以及文件名称 FileDialog fileDialog new FileDialog(frame, 保存图片, FileDialog.SAVE); fileDialog.setVisible(true); //展示用户设置的保存路径以及文件名称 String dir fileDialog.getDirectory(); String fileName fileDialog.getFile(); try { //注意这里要写写”JPEG“,文件格式名 ImageIO.write(image, JPEG, new File(dir, fileName)); } catch (IOException ex) { ex.printStackTrace(); } }); //将打开文件以及保存文件放到menu组件中 menu.add(open); menu.add(save); //将menu组件放在菜单栏中 menuBar.add(menu); //把菜单条放在窗口中 frame.setMenuBar(menuBar); frame.add(drawArea); //自定义frame的框架并且可见 frame.setBounds(200, 200, 740, 508); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { new day23().init(); } }说真的这两年看着身边一个个搞Java、C、前端、数据、架构的开始卷大模型挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis稳稳当当过日子。Java真的没有发展吗学习Java并非真的没有退路相反如果将Java与现在热门的大模型结合会碰撞出不一样的火花大模型技术正在为Java开发者开辟新赛道1、推理环节的核心语言大模型训练依赖Python生态的高性能计算资源但推理阶段更注重模型部署、性能优化和系统集成。Java凭借其稳定性、跨平台特性和生态优势成为推理环节的理想选择。例如通过DJLDeep Java Library直接加载和使用预训练模型无需深入底层Python代码。2、工程化落地的关键角色大模型从实验室到产业级应用的过程中工程化能力成为核心竞争力。Java开发者在代码规范、测试流程、版本管理等方面的积累能大幅降低大模型项目的研发成本。例如利用Spring Cloud Gateway实现大模型调用的网关进行请求限流、熔断降级和日志追踪。3、多场景应用的桥梁Java在大模型工程化中承担关键职责数据处理层通过Apache PDFBox、Spring Batch等工具解析非结构化数据实现知识库的向量化处理。检索服务层调用大模型的Embedding API生成向量数据并通过向量数据库如Milvus进行相似度匹配。模型调用层通过适配器模式封装不同大模型的调用接口实现“一键切换”。应用服务层基于Spring Boot构建RESTful API灵活编排“检索-生成”链路。因此捕获AI掌握技术是关键让AI成为我们最便利的工具.一定要把现有的技术和大模型结合起来而不是抛弃你们现有技术掌握AI能力的Java工程师比纯Java岗要吃香的多。即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇如何学习AGI大模型作为一名热心肠的互联网老兵我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享**一、2025最新大模型学习路线一个明确的学习路线可以帮助新人了解从哪里开始按照什么顺序学习以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛没有明确的学习路线可能会导致新人感到迷茫不知道应该专注于哪些内容。我们把学习路线分成L1到L4四个阶段一步步带你从入门到进阶从理论到实战。L1级别:AI大模型时代的华丽登场L1阶段我们会去了解大模型的基础知识以及大模型在各个行业的应用和分析学习理解大模型的核心原理关键技术以及大模型应用场景通过理论原理结合多个项目实战从提示工程基础到提示工程进阶掌握Prompt提示工程。L2级别AI大模型RAG应用开发工程L2阶段是我们的AI大模型RAG应用开发工程我们会去学习RAG检索增强生成包括Naive RAG、Advanced-RAG以及RAG性能评估还有GraphRAG在内的多个RAG热门项目的分析。L3级别大模型Agent应用架构进阶实践L3阶段大模型Agent应用架构进阶实现我们会去学习LangChain、 LIamaIndex框架也会学习到AutoGPT、 MetaGPT等多Agent系统打造我们自己的Agent智能体同时还可以学习到包括Coze、Dify在内的可视化工具的使用。L4级别大模型微调与私有化部署L4阶段大模型的微调和私有化部署我们会更加深入的探讨Transformer架构学习大模型的微调技术利用DeepSpeed、Lamam Factory等工具快速进行模型微调并通过Ollama、vLLM等推理部署框架实现模型的快速部署。整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握而L3 L4更多的是通过项目实战来掌握大模型的应用开发针对以上大模型的学习路线我们也整理了对应的学习视频教程和配套的学习资料。二、大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF三、大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。四、大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。五、大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

wordpress加入地图seo网络优化公司排名

Windows Docker 安装指南 引言 Docker 是一个开源的应用容器引擎,它允许您将应用程序与基础设施分开,以此快速交付软件。本指南旨在为您提供在 Windows 系统上安装 Docker 的详细步骤。 1. 系统要求 在开始安装 Docker 之前,请确保您的 Windows 系统满足以下要求: Wind…

张小明 2026/1/8 2:54:16 网站建设

动漫网站建设赚钱吗c语言做网站的代码

一、常见的方案(这种适合于参数和数据不同步情况) 1.可以使用端口直接写固定参数 2.写状态机来改变参数 3.使用ARM使用axilite来配置参数二、如果参数和数据同步怎么办 这个适合需要cache,可以是RAM,可以是FIFO,可以是DDR,可以是Flash,可以是…

张小明 2026/1/1 20:57:10 网站建设

网站的目的it外包的优点不包括

Dify中异步回调机制设计:处理长时间运行任务 在构建AI驱动的应用时,我们常常会遇到一个棘手的问题:用户点击“生成报告”后,页面卡住十几秒甚至更久——这背后往往是大语言模型(LLM)在执行复杂的推理流程。…

张小明 2026/1/1 23:11:06 网站建设

网站建设岗位主要做什么一级a做爰片在线看网站

EmotiVoice与Stable Diffusion的多模态融合:让AI“能说会画” 在数字内容创作的前沿,一个越来越清晰的趋势正在浮现:用户不再满足于“看到”或“听到”——他们想要的是“沉浸”。一段视频如果画面情绪和语音语调不匹配,哪怕只是微…

张小明 2026/1/8 8:57:56 网站建设

网站集约化建设2019年4月黑龙江农垦建设局网站

Ollama 能否运行 Qwen3-32B?实测兼容性与部署全解析 在大模型落地加速的今天,越来越多开发者和企业开始关注一个问题:能否用一条命令就把像 Qwen3-32B 这样的国产高性能大模型跑在本地机器上? Ollama 的出现让这个设想变得触手可…

张小明 2026/1/2 2:29:53 网站建设