概述
用Java实现好玩的可DIY的音乐计算器v0.33
特点:个性化,定制化,可简单DIY;
(不是什么程序都能简单DIY;)
一、功能简介:
- 计算器菜单&按键板功能:
加减乘除四则运算,十六进制"hex"计算,带"pi"与"e"的常数计算(如圆和球体),带括号的公式计算"f(x)",高次幂与开方计算,常用对数与自然对数计算,三角函数计算,阶乘与倒数计算,时间计算;(可简单DIY) - 常数查询:常用"Maths"数学常数,常用"Physics"物理常数;(可简单添加)
- 预定义三种界面:(待实现, 详见v0.33预置菜单)
a. 典型界面"Typical"; (不可DIY)
b. 个性化界面"Personal"; (可DIY)
c. 科学计算器"Scientific"; (可DIY)
d. 界面可拖拉变形: (见后面图, 可复位到启动界面) - 时钟功能; 日历查询&时间计算功能:
a. 时钟日历显示; (见后面图, 时间/日期/星期/周数)
b. 时钟日历查询; (v0.34后逐步完善)
c. 时钟日历计算; (v0.34后逐步完善)
d. midi音乐报时钟; (与midi配合,可DIY音乐)
e. 语音报时钟; (定时提醒功能, 语音素材准备中) - 实时天气查询功能:(需联网,包括室内外温/湿度/PM2.5)
- Midi功能: (或将集成到v0.35)
a. midi音乐播放功能; (播放已有".mid"文件)
b. midi音乐简谱编曲功能; (见图,参考本博客相关文章)
c. midi音乐简易键盘功能; (类似电子琴自动和弦&节拍) - 示例演示: (相当于帮助说明, 包括预置查询资料)
- 版本计划:v1.00将是完整版,到时将具备以上绝大部分功能;以后或扩充或完善不确定。
二、菜单实现:
- Java的优势: 比C++/C实现简单,比Python速度快,且应用更广泛。
- Java的菜单:利用可变长度的二维或多维数组做菜单特别方便,可以轻松做出复杂的菜单;(参看后面菜单定义的源代码)
三、对话框实现:
1. 对话框信息:
//对话框定义;物主:frame;模式:true;
private Dialog about = new Dialog(frame,"关于",true);
private Label info = new Label("Auther:yy-2020",Label.CENTER);
2. 对话框实现:
//v0.34;定义"关于"对话框about;v0.33新增;
private void aboutInit() {
about.setSize(100,70);
about.setLocationRelativeTo(frame); //位置跟随;关联frame;
about.setResizable(false); //默认true;
about.add(info,BorderLayout.CENTER); //,"Center";
about.addWindowListener(new MyWinListen()); //注册窗口监听器;MyWinListen;
about.setVisible(true);
}
3. 对话框启动:
case "About": aboutInit();break;
4. 对话框关闭:
对话框about直接关闭即可,只有主窗口(frame)才完全退出;
//v0.33;20221001;退窗口事件响应类;
//exit.addActionListener(e->System.exit(0));
class MyWinListen extends WindowAdapter{
public void windowClosing(WindowEvent e){
e.getWindow().setVisible(false); //关闭窗口;
e.getWindow().dispose(); //释放资源;
if(e.getSource()==frame)
System.exit(0); //完全退出;
}
}
四、部分源码:
展示菜单实现原理;
(参考上一篇v0.32的完整源码,预留按钮为DIY参考)
//v0.34menu+midi;20220926;DbY多功能计算器。【更少代码&更多功能】
package calculator;
import java.awt.*;
import java.awt.event.*;
public class Calculate {
//------------------------------------
//v0.30;20220918;定义全局变量;
double num1,num2,mem; //操作数&中间记忆,均为double;
boolean isNum; //数字拼接标志位,转存后失效;
String Oper; //二元计算操作符,依赖"="计算;
TextField tfResult; //显示结果;可编辑,由C按键复制后清空;
TextArea taRecord; //显示记录;可编辑复制;用CR按键清空;
//v0.33;20220930;定义窗体软键盘布局;(用于鼠标和触摸屏操作)【核心定义】
//预置按钮;tone音色,tune音调,octave八度,sustain延音,tempo拍子速度;chord和弦;
private final String []KEYS = {
"temp" ,"f(x)" ,"n!" ,"(" ,"d" ,"e" ,"f" ,"x^y",
"tone" ,"log1" ,"cbrt" ,")" ,"a" ,"b" ,"c" ,"%",
"tune" ,"tan" ,"sqrt" ,"MC" ,"7" ,"8" ,"9" ,"/",
"oct" ,"cos" ,"x^3" ,"M" ,"4" ,"5" ,"6" ,"*",
"sus" ,"sin" ,"x^2" ,"E" ,"1" ,"2" ,"3" ,"-",
"chrd" ,"rand" ,"1/x" ,"PI" ,"0" ,"." ,"-/+" ,"+",
"midi" ,"time" ,"dec" ,"hex" ,"CR" ,"C" ,"BS" ,"=",
};
//定义键盘属性;
private final int kRow = 7; //定义按键行数6;
private final int kCol = 8; //定义按键列数5;
private final int nKeys=KEYS.length;
//
//------------------------------------
//定义菜单;v0.33新增;
//constant;mathematics,physics;
//example;计算球体示例,midi编曲示例;
private final String [][]MENUcn = {
{"文件","打开","保存","退出"},
{"常数","数学","物理"},
{"选项","典型","个性","科学","重置"},
{"帮助","示例","关于"}
};
private final String [][]MENU = {
{"File","Open","Save","Exit"},
{"Constant","Maths","Physics"},
{"Option","Typical","Personal","Scientific","Reset"},
{"Help","Example","About"}
};
//------------------------------------
//v0.33;20220930;初始化方法;
public void init() {
//0.定义框架;主窗口;v0.32最佳推荐(345,200);--v0.3竖置(200,320);
Frame frame = new Frame("DbY计算器v0.33");
frame.setSize(345,234); //v0.33最佳推荐(345,234);
frame.setBackground(new Color(0,64,96)); //自定义深蓝;推荐Color.lightGray;
//frame.setBackground(Color.lightGray); //设置窗口的背景色;窗口默认背景为白色;
frame.setLocationRelativeTo(null); //将窗口居中;若无该方法,窗口将位于屏幕左上角;
//1.定义菜单;v0.33新增;创建菜单&菜单项,命名@MENU[][];菜单分类创建/注册/放置;
MenuBar mb = new MenuBar();
Menu []menu = new Menu[MENU.length];
MenuItem [][]mItem = new MenuItem[MENU.length][];
MyMenuLis mbl = new MyMenuLis(); //自定义菜单执行动作,事件统一响应;【核心类】
for (int i = 0; i < MENU.length; i++){
menu[i] = new Menu(MENU[i][0]); //创建菜单;
menu[i].addActionListener(mbl); //监听注册;
mb.add(menu[i]); //放置菜单;
mItem[i] = new MenuItem[MENU[i].length-1];
for (int j = 0; j < MENU[i].length-1; j++){
mItem[i][j] = new MenuItem(MENU[i][j+1]); //创建菜单项;
mItem[i][j].addActionListener(mbl); //监听注册;
menu[i].add(mItem[i][j]); //放置菜单项;
}
}
frame.setMenuBar(mb);
//2.放置组件;v0.30;三大件即面板/文本区/文本字段,同时注册按钮监听器;
//a.面板容器;其中按键选用网格布局;
Panel panel = new Panel(); //创建按键面板;
panel.setLayout(new GridLayout(kRow,kCol)); //设置布局;网格间距(1,1);
frame.add(panel,"East"); //键盘位置;South/East;
//*放置按钮;按钮布局顺序由串组KEYS[]决定;【核心段】
Button []keys = new Button[nKeys]; //创建按钮组对象;
//MyKeysLis mkl = new MyKeysLis(); //自定义按钮执行动作,事件统一响应;【核心类】
for (int i = 0; i < nKeys; i++){
keys[i] = new Button(KEYS[i]); //创建单个按钮,按钮名@KEYS[];
keys[i].addActionListener(new MyKeysLis()); //监听注册;自定义按钮动作响应类MyKeysLis;
panel.add(keys[i]); //放置按钮;每个按钮按KEYS[]顺序;
}
//b.文本区,可显示多行多列文本和滚动条;
taRecord = new TextArea(); //创建文本区,操作记录显示区;
taRecord.setEditable(true); //设置输入框允许编辑;
taRecord.setColumns(24); //设置输入框列数,推荐18字符;
taRecord.setRows(5); //设置输入框高度,推荐3行字符;
frame.add(taRecord,"Center"); //在框架上添加多行输入框;Center/West;
//c.文本框,单行文本字段;
tfResult = new TextField(); //文本框,计算结果显示字段;
frame.add(tfResult,"North"); //在框架上添加文本框;South/North;
//tfResult.setEditable(false); //文本框不允许修改结果
//全局窗口;包括关闭窗口按钮的监听;
frame.addWindowListener(new MyWinLis()); //注册窗口监听器;MyWinLisn;
frame.setVisible(true); //显示框架;
}
//------------------------------------
//(省略部分参考前文完整代码)
}
五、外观图:
DbY计算器v0.33-03完整界面:简易midi编曲演示
DbY计算器v0.33-02完整界面:显示记录区和全部功能键
DbY计算器v0.33-04完整界面:简易midi编曲与时钟演示
DbY计算器v0.33-05菜单界面:v0.4将预定义三种界面
DbY计算器v0.33-01典型界面:完全隐藏记录区和部分功能键
最后
以上就是着急帆布鞋为你收集整理的JavaGUI:多功能计算器(二)--AWT菜单&对话框(源码说明)的全部内容,希望文章能够帮你解决JavaGUI:多功能计算器(二)--AWT菜单&对话框(源码说明)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复