黑马程序员——GUI(3)菜单&FileDialog

本文介绍如何在Java程序中实现菜单栏、菜单及菜单项的功能,并通过示例展示了如何使用文件对话框进行文件的选择与操作。包括菜单结构的搭建、监听器的设置以及文件读写的基本流程。
------- android培训java培训、期待与您交流! ----------

总的来说,Memu建立在Menubar上,MenuItem建立在Menu上。

如果想给一个程序增加一个菜单条,就需要新建一个Menubar,然后再在Menubar上编辑菜单。

一个Menubar上可以有多个Menu,每个Menu上可以添加MenuItem也就是菜单项,或者是添加一个子菜单Menu,形成多级菜单。


注意:其他组件,以及Menu和MenuItem。添加使用的是add方法,但是MenuBar添加到窗体使用的是setMenuBar(MenuBar mb);

=======================================================================================

FileDialog是Dialog的子类,继承了其特点,但是可以通过FileDialog选择一个文件位置,以便之后打开或者保存。

1.创建:

FileDialog f=new FileDialog(frmBase,mode);//mode指示这个文件对话框是打开还是保存文件

FileDialog.SAVE

FileDialog.LOAD

2.获取文件信息(为什么Dialog没有类似的方法!)

 String getDirectory() 
          获取此文件对话框的目录。
 String getFile() 
          获取此文件对话框的选定文件。

3.注意事项:

if(null==fd.getDirectory()||null==fd.getFile())
return;
fText=new File(fd.getDirectory(),fd.getFile());

在获取FileDialog选择的文件信息时,一定要先判断目录和文件是否能获取到,因为有时候打开对话框可能会不选择文件而关闭。

如果不先判断则第二句就会异常了。


练习:

/*
MenuBar
MenuItem
  |--Menu
  
  menu添加到menubar上
  menuitem添加到menu上
  子菜单即是一组菜单项的集合。可以添加在菜单上,形成多级菜单


*/
package test;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

class MenuDemo
{
	private Frame f;
	private MenuBar mb;
	private Menu mRoot;
	private MenuItem miOpen,miSave,miSaveAs,miClose;
	private TextArea taEditArea,taStatus;
	private Label l;
	private File fText;	
	
	MenuDemo()
	{
		wndInit();		
	}
	
	private void wndInit()
	{
		f=new Frame("Menu Demo");
		f.setBounds(300,200,600,500);
		//f.setLayout(new FlowLayout());
		regfListener();
			//新建一个菜单条
			mb=new MenuBar();
				//新建一个菜单
				mRoot=new Menu("File");
				mb.add(mRoot);
					//新建一个菜单项
					miOpen=new MenuItem("Open");
					mRoot.add(miOpen);
					regmiOpenListner();
					
					miSave=new MenuItem("Save");
					mRoot.add(miSave);
					regmiSaveListner();

					miSaveAs=new MenuItem("SaveAs");
					mRoot.add(miSaveAs);
					regmiSaveAsListner();

					
					Menu mSublv1=new Menu("Menu Lv1");
					mRoot.add(mSublv1);
					
						MenuItem milv1Item1 =new MenuItem("MenuItem Lv1 1");
						mSublv1.add(milv1Item1);
						MenuItem milv1Item2 =new MenuItem("MenuItem Lv1 2");
						mSublv1.add(milv1Item2);
						Menu mSublv2=new Menu("Menu Lv2");
						mSublv1.add(mSublv2);
						
							MenuItem milv2Item1 =new MenuItem("MenuItem Lv2 1");
							mSublv2.add(milv2Item1);	
							
					miClose=new MenuItem("Close");
					mRoot.add(miClose);
					regmiCloseListner();
					
			//f.add(mb);
			/*框架添加菜单不是用add方法,而是
			setMenuBar(MenuBar )			
			*/
			f.setMenuBar(mb);
			
			
			taEditArea=new TextArea();
			f.add(taEditArea,BorderLayout.CENTER);			
			//添加一个文本区做状态栏,显示当前打开的文件
			//taStatus=new TextArea(null,0,0,TextArea.SCROLLBARS_NONE);
			//f.add(taStatus,BorderLayout.SOUTH);
			
			l=new Label();
			f.add(l,BorderLayout.SOUTH);
		f.setVisible(true);	
	}
	
	
	private void regfListener()
	{
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e)
			{
				newPrint("windowClosing!");
				System.exit(0);
			}
			
		});
	}
	
	private void regmiCloseListner()
	{
		miClose.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e)
			{
				newPrint("closed by Button:miClose");
				System.exit(0);
			}
		});
	}
	
	private void regmiOpenListner()
	{
		miOpen.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e)
			{
				/*public FileDialog(Frame/Dialog ,String ,int mode)
				
				mode:FileDialog.LOAD  FileDialog.SAVE
				
				*/				
				
				FileDialog fd=new FileDialog(f,"OPEN",FileDialog.LOAD);
				fd.setVisible(true);
				
				//在获取FileDialog选择的文件信息时,一定要先判断目录和文件是否能获取到,因为有时候打开对话框可能会不选择文件而关闭。
				//如果不先判断则第二句就会异常了。
				if(null==fd.getDirectory()||null==fd.getFile())
					return;
				fText=new File(fd.getDirectory(),fd.getFile());						
				newPrint("going to open the file: "+fText.toString());
				showFile(fText);
			}
		});
	}
	private void showFile(File fText)
	{
		l.setText(fText.toString());
		taEditArea.setText("");
		
		try
		{
			BufferedReader bin=new BufferedReader(new FileReader(fText));
			String tmpLine=null;
			while(null!=(tmpLine=bin.readLine()))
			{
				taEditArea.append(tmpLine+"\r\n");
			}
			bin.close();	
		}
		catch(IOException ioe)
		{
			
		}		
	}	
	
	private void regmiSaveListner()
	{
		miSave.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e)
			{				
				if(null==fText)
				{
					
					if(!setSaveFilePath())
						return;		
				}				
				newPrint("going to save the file at: "+fText.toString());
				saveFile(fText);				
			}			
		});
	}	
	private void regmiSaveAsListner()
	{
		miSaveAs.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e)
			{				
				if(!setSaveFilePath())
					return;				
				newPrint("going to save the file at: "+fText.toString());
				saveFile(fText);				
			}			
		});
	}
	private Boolean setSaveFilePath()
	{
		FileDialog fd=new FileDialog(f,"SAVE",FileDialog.SAVE);				
		fd.setVisible(true);	
		
		if(null==fd.getDirectory()||null==fd.getFile())
		{
			newPrint("here2");
			return false;
		}
			
		fText=new File(fd.getDirectory(),fd.getFile());			
		return true;
	}
	private void saveFile(File fText)
	{
		try
		{
			BufferedWriter bout=new BufferedWriter(new FileWriter(fText));
			
			bout.write(taEditArea.getText());	
			
			bout.close();
			
		}
		catch(IOException e)
		{
			
		}				
	}
	
	public static void main(String[] args)
	{
		new MenuDemo();
		newPrint("console thread");
		
	}
	public static void newPrint(Object obj)
	{
		System.out.println(obj);
		
	}
}


内容概要:本文介绍了如何利用 GitHub Copilot 辅助进行程序调试与 Bug 分析,强调 Copilot 不仅可用于代码生成,更是强大的代码分析与调试工具。文章详细阐述了 Copilot 在调试复杂问题、老旧项目维护和难以复现 Bug 场景下的优势,提出了“先分析、再修改”的四步流程:分析原因→评估风险→提出方案→修改代码,并推荐结合错误日志、用户操作等信息精准提问,提升 AI 回答质量。同时展示了如何通过 Copilot 增强调试能力,如自动加日志、异常保护、生成测试数据和性能分析。最后通过游戏拾取系统的实际案例,说明如何结构化描述问题以获得有效反馈。; 适合人群:具备一定开发经验,正在参与项目调试或维护工作的程序员,尤其是面对复杂逻辑、历史代码或难复现 Bug 的 1-3 年开发者;也适合希望提升 AI 协作能力的技术人员。; 使用场景及目标:①快速定位偶发性崩溃、数据异常等问题根源;②理解无文档或结构混乱的老代码模块;③优化调试流程,借助 AI 生成诊断建议、修复方案与测试用例;④构建更具健壮性的程序,提前发现潜在缺陷。; 阅读建议:学习者应结合自身项目中的真实问题,按照文中提供的结构化提问模板实践,逐步训练与 Copilot 的协作能力,重视问题描述的完整性与准确性,避免直接要求修改代码,优先通过分析提升对系统的理解。
内容概要:本文针对高精度电流控制下的永磁同步电机(PMSM)参数辨识难题,提出一种基于粒子群优化算法(PSO)的多参数辨识模型,并在Simulink环境中完成系统级仿真实现。研究旨在克服传统控制中因电机参数(如定子电阻、交直轴电感、永磁磁链等)随温度、负载变化而失配所导致的电流控制性能下降问题。通过构建以电流跟踪误差为核心的适应度函数,利用PSO算法全局寻优能力强的特点,实现对关键电机参数的在线或离线精确辨识。文中详述了PSO算法的实现机制、参数初始化策略、收敛判据设计以及与PMSM矢量控制系统的集成方法,验证了该方案在不同运行工况下的辨识精度、收敛速度与鲁棒性,显著提升了电流环的动态响应品质与稳态控制精度。; 适合人群:具备电机驱动控制、现代控制理论及优化算法基础,熟悉MATLAB/Simulink仿真平台,从事高性能PMSM控制系统研发的研究生、高校科研人员及自动化、电力电子领域的工程师;特别适合正在开展参数自适应、智能控制算法应用等相关课题的研究者。; 使用场景及目标:①应用于高端制造装备、电动汽车驱动系统、精密伺服系统等对电流控制精度要求严苛的场合;②解决实际工程中因电机温升、老化等因素引发的参数漂移问题,提升系统长期运行稳定性;③作为智能优化算法与电机控制深度融合的教学案例,帮助理解PSO在复杂非线性系统参数辨识中的应用逻辑与实现路径。; 阅读建议:建议读者结合提供的Simulink仿真模型进行复现实验,重点剖析PSO算法模块与电机控制模型的接口设计、适应度函数的构建原则及参数敏感性分析方法,可进一步尝试引入其他先进优化算法(如GWO、HHO)进行性能对比,以深入掌握不同智能算法在工程辨识问题中的适用性与优劣。
内容概要:本文提出了一种基于遗传算法的新型任务调度算法,专门针对异构分布式系统中的任务调度问题展开研究。通过Matlab代码实现该算法,旨在优化任务在计算能力不同的节点之间的分配策略,从而提升系统整体的资源利用率和任务执行效率。研究重点包括调度模型的设计、任务映射机制的构建以及遗传算法中编码方式、适应度函数、选择、交叉与变异操作等关键参数的优化配置,确保在复杂多变的异构环境下实现高效、低延迟的任务调度。该方法具有良好的可复现性和扩展性,适用于多种智能优化场景的对比与改进。; 适合人群:具备一定编程基础和优化算法知识,从事分布式系统、云计算、高性能计算或智能优化算法研究的科研人员及研究生。; 使用场景及目标:①应用于云计算平台、边缘计算网络等异构计算环境中的任务调度优化;②为研究人员提供完整的Matlab代码框架,支持算法复现、性能测试及与其他智能调度算法(如粒子群、蚁群等)的对比分析;③支撑高水平学术论文的实验验证与科研项目开发。; 阅读建议:建议读者结合Matlab代码深入理解遗传算法在任务调度中的具体实现细节,重点关注染色体编码策略与适应度函数设计,并可通过调整种群规模、迭代次数、交叉变异概率等参数进一步优化算法性能,探索引入混合优化策略的可能性。
内容概要:本文档详细介绍了基于Simulink的双机并联虚拟同步发电机(VSG)系统仿真模型,重点涵盖微电网黑启动、有功/无功功率分配、虚拟阻抗控制及预同步并网控制等核心技术的实现方法。通过构建完整的VSG控制系统,实现了在孤岛模式下微电网的安全启动与稳定运行,有效解决了多逆变器并联系统中的功率均分问题。采用虚拟阻抗技术优化输出阻抗特性,提升了系统的稳定性与动态响应能力;同时引入预同步控制策略,确保并网前电压、频率和相位的高度匹配,显著降低并网冲击电流。该仿真平台为研究微电网自治运行、提升可再生能源消纳能力以及VSG关键控制技术的验证提供了高可信度的实验环境。; 适合人群:电力系统、电气工程及其自动化等相关专业的高校研究生、科研人员,以及从事微电网、分布式能源系统、新能源并网技术开发的工程技术人员。; 使用场景及目标:①用于教学与科研中对虚拟同步机控制策略的理解与验证;②支撑微电网黑启动过程的建模仿真与优化研究;③开展多逆变器并联运行下的功率协调控制算法设计与性能测试;④为实际工程中微电网控制器的开发与调试提供理论依据与仿真支持。; 阅读建议:建议结合MATLAB/Simulink环境动手搭建模型,对照文档逐步实现各功能模块,重点关注控制环路设计、参数整定及仿真结果分析,可进一步扩展至多机多场景复杂工况以深化对系统动态行为的理解。
内容概要:本文针对电网频率稳定问题,研究了一种虚拟同步发电机(VSG)惯量与阻尼协同自适应控制策略,结合Simulink仿真与Matlab代码实现,提出通过动态调节VSG的关键控制参数以增强系统对频率扰动的响应能力。文章系统阐述了VSG的工作原理,重点设计了惯量和阻尼系数的自适应协同调控机制,有效应对负荷突变及可再生能源出力波动带来的频率偏差问题。所提策略通过构建反馈控制环路,实现对系统频率变化率和偏差的双重响应,提升了电力系统的动态稳定性与鲁棒性。仿真结果表明,该方法在多种运行工况下均能显著抑制频率波动,改善频率响应性能。; 适合人群:具备电力系统基础理论知识、熟悉Matlab/Simulink仿真环境的研究生、科研人员,以及从事新能源并网、微电网控制、虚拟同步机技术开发等相关领域的工程技术人员。; 使用场景及目标:①深入理解虚拟同步发电机在现代电力系统中提供惯性支撑和频率调节的作用机制;②掌握VSG惯量与阻尼协同控制的建模方法与自适应算法设计流程;③复现并优化现有控制策略,用于学术论文研究、课题项目开发或实际工程方案验证; 阅读建议:建议读者结合提供的Matlab代码与Simulink仿真模型同步运行,细致分析各模块的搭建逻辑与参数设置,重点关注自适应控制环节的设计原理,可通过设置不同的负载扰动或新能源波动场景进行对比实验,全面评估控制策略的适应性与优越性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值