如何使用swing创建一个BeatBox
首先,我们需要回顾一些内容(2017-01-04 14:32:14):
1.Swing组件
Swing的组件(component,或者称之为元件),是较widget更为正确的术语,它们就是会放在GUI(Graphical User Interface)上面的东西,这些内容就是一些用户会看到并且与其交互的,如Text Field、Button、scrollable、list、radio button等,这些组件均是继承自java.swing.JComponent;
在Swing中,几乎所有的组件都是安置到其他组件当中。
2.创建GUI的四个步骤:
- 创建window(JFrame)
JFrame frame=new JFrame();
- 创建组件
JButton button=new JButton(“click me”);
- 将组件添加到frame上
frame.getContentPane.add(BorderLayout.EAST,button);
- 显示出来
frame.setSize(300,300);
frame.setVisible(true);
3.布局管理器(layout Managers)
首先,布局管理器是与特定组件相关联的java对象,他大多数是背景组件。
其次,布局管理器是用来控制所关联组件上携带的其他组件,换言之,如果某个框架带有面板,面板上有按钮的情况下,则面板布局管理器就是控制按钮的大小与位置,而框架的布局管理器是控制着面板的大小与位置。
将对应的按键添加到对应的面板上,可以如下实现:
JPanel jpanel=new JPanel();
JButton button=new JButton(“click me”);
jpanel.add(button);
4.三大首席管理器:
- border
- flow
- box
1)BorderLayout:该管理器会将组建分割成5个区域,每个区域只能放置一个组件,由此管理员安置的组件不会取得默认的大小。这个也是框架默认得布局管理器;
2)FlowLayout:该管理器的行为与文书处理程序的版面配置方式差不多。这个组件会依照理想的大小呈现,并且胡依照从左到右,依次加入的顺序(中间可能会换行)排列,因此如果组建放不下一行的时候会自动换行。这个是面板默认得布局管理器。
3)BoxLayout:它就像FlowLayout一样让每个组件按照默认得大小,依次按照加入的顺序进行排列,它是以垂直的方式排列(也可以水平,但是通常我们只关心垂直的方式)。与FlowLayout不 同的是,它是需要插入某种换行的机制来强制组件从新的一列进行排列。
接下来我们看一下干货:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList; import javax.sound.midi.*;
import javax.swing.*; public class BeatBox {
JPanel mainJPanel;
ArrayList<JCheckBox> checkboxslist;
Sequencer sequencer;
Sequence sequence;
Track track;
JFrame theFrame;
String[]instrumentNames={
"Bass Drum","closed Hi-Hat","open Hi-Hat","Acoustic Snare",
"Crash Cymbal","Hand Clap","High Tome","Hi Bongo","Maracas",
"Whistal","Low Conga","Cowbell","Vibraslap","Low_mid Tom",
"High Agogo","open High Coga"
};//乐器的名称,用String的array维护
int []instrument={35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63};//实际乐器的关键字,比如说35是Bass Drum,42是closed Hi-Hat
public static void main(String[] args) {
// TODO Auto-generated method stub
new BeatBox().buildGUI();
}
public void buildGUI(){
theFrame = new JFrame("Cyber BeatBox");
theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭时关闭程序
BorderLayout layout = new BorderLayout();//定义了一个BorderLayout面板对象
JPanel background=new JPanel(layout);//将面板对象实例化JPanel对象
background.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));//用于设置边缘空白大小 checkboxslist=new ArrayList<JCheckBox>();
Box buttonBox = new Box(BoxLayout.Y_AXIS); JButton start = new JButton("start");
start.addActionListener(new MyStartlistener());
buttonBox.add(start); JButton stop = new JButton("stop");
start.addActionListener(new MyStoplistener());
buttonBox.add(stop); JButton upTempo = new JButton("Tempo up");
start.addActionListener(new MyupTempolistener());
buttonBox.add(upTempo); JButton downTempo = new JButton("Tempo down");
start.addActionListener(new MydownTempolistener());
buttonBox.add(downTempo); Box nameBox=new Box(BoxLayout.Y_AXIS);
for(int i=0;i<16;i++){
nameBox.add(new Label(instrumentNames[i]));
} background.add(BorderLayout.EAST,buttonBox);
background.add(BorderLayout.WEST,nameBox); theFrame.getContentPane().add(background); GridLayout gridLayout=new GridLayout(16,16);//创建具有指定行数和列数的网格布局。 布局中的所有组件都具有相等的大小。
//行和列中的一个(但不是两者)可以为零,这意味着任何数量的对象都可以放置在一行或一列中。
gridLayout.setVgap(1);//将组件之间的垂直间距设置为指定的值。
gridLayout.setHgap(2);//将组件之间的水平间距设置为指定的值。
mainJPanel=new JPanel(gridLayout);
background.add(BorderLayout.CENTER,mainJPanel); for(int i=0;i<256;i++){
JCheckBox checkBox=new JCheckBox();
checkBox.setSelected(false);
checkboxslist.add(checkBox);
mainJPanel.add(checkBox);
}//结束循环
//创建checkBox组,并将其设定成未勾选的false,并添加到arraylist以及面板上 setUpMidi(); theFrame.setBounds(50, 50, 300, 300);
theFrame.pack();//pack()函数:使此窗口的大小适合其子组件的首选大小和布局。 如果任一维度小于由上次调用setMinimumSize方法指定的最小大小,则会自动放大窗口的最终宽度和高度。
//如果窗口和/或其所有者不可显示,则在计算优选大小之前使它们两者都可显示。 窗口在计算其大小后生效。
theFrame.setVisible(true);
}//关闭buildGUI()方法 public void setUpMidi(){
try{ sequencer= MidiSystem.getSequencer();//此方法等效于调用getSequencer(true) 创建sequencer
sequencer.open();
//创建并打开队列 sequence=new Sequence(Sequence.PPQ, 4);
track=sequence.createTrack();
//创建队列并track sequencer.setTempoInBPM(120); }catch(Exception e){
e.printStackTrace();
}
}//关闭 setUpMidi()方法 public void buildTrackAndStart(){ int []trackList=null;//创建出16个元素的数组来存储一项乐器值,如果有该演奏,其值就将会是关键字值,否则将值为零 sequence.deleteTrack(track);
track=sequence.createTrack();//清除旧的track,做一个新的 for (int i = 0; i < 16; i++) {//每个乐器执行一次
trackList=new int[16]; int key=instrument[i];//设代表乐器的关键字 for(int j = 0;j<16;j++){//每一拍执行一次
JCheckBox jc=(JCheckBox)checkboxslist.get(j+16*i);
if(jc.isSelected()){//如果勾选,那么关键字的值放到数组得该位置上,不然的话,就补零
trackList[j]=key;
}else{
trackList[j]=0;
}
}//关闭循环 makeTracks(trackList);
track.add(makeEvent(176,1,127,0,16));//创建此乐器事件,并添加到track上;
}//关闭外循环 track.add(makeEvent(192,9,1,0,15)); try{
sequencer.setSequence(sequence);
sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);
sequencer.start();
sequencer.setTempoInBPM(120);//以每分钟的拍数设置速度。 播放的实际速度是指定值和速度因子的乘积。
}catch(Exception e){
e.printStackTrace();
}
}//结束buildTrackAndStart方法 public class MyStartlistener implements ActionListener{
//按钮的监听者
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
buildTrackAndStart();
} }//内部类关闭
public class MyStoplistener implements ActionListener{
//按钮的监听者
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
sequencer.stop();
} }//内部类关闭
public class MyupTempolistener implements ActionListener{
//按钮的监听者
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
float tempoFactor=sequencer.getTempoFactor();
sequencer.setTempoFactor((float)(tempoFactor*1.03));//节奏因子,预设为1.0,每次调整3%
} }//内部类关闭
public class MydownTempolistener implements ActionListener{
//按钮的监听者
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
float tempoFactor=sequencer.getTempoFactor();
sequencer.setTempoFactor((float)(tempoFactor*.97));//节奏因子,预设为1.0,每次调整3%
} }//内部类关闭
public void makeTracks(int []list){ for (int i = 0; i < 16; i++) {
int key=list[i];
if (key!=0) {
track.add(makeEvent(144,9,key,100,i));
track.add(makeEvent(128,9,key,100,i+1));//创建Note on以及Note off,并添加到track上
}
}
}//关闭makeTracks方法
public MidiEvent makeEvent(int comd,int chan,int one,int two,int tick){
MidiEvent event=null;
try{
ShortMessage shortMessage=new ShortMessage();//创建消息实例
shortMessage.setMessage(comd, chan, one, two);//调用setMessage
event=new MidiEvent(shortMessage, tick);//制作消息的MidiEvent实例
}catch(Exception e){
e.printStackTrace();
}
return event;
}//关闭makeEvent方法,该方法是制作消息以及事件
}
对应的界面呈现为:

问:框架为什么不能像面板那样直接加上组件呢?
答:JFrame会这么特殊是因为它是让无显示在画面上的接点。
因为Swing的组件纯粹是由Java构成的,JFrame必须要连接到底层的操作系统以便于存储显示装置。我们可以把面板想做是安置在JFrame上的100%的java层,或者把JFrame想作是支撑面板的框架,他甚至可以使用 自定义的方式换掉框架的面板:
nyframe.setContentpane(myPanel);
如何使用swing创建一个BeatBox的更多相关文章
- Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)
本文将讲解如何做一个类似MyEclipse启动画面的闪屏,为Java Swing应用程序增添魅力. 首先看一下效果图吧, 原理很简单,就是创建一个Dialog,Dialog有一个进度条和一个Label ...
- java用户界面—创建一个面板
先从基础学起 创建一个面板 代码如下: package Day08; import java.awt.FlowLayout; import javax.swing.JButton;import jav ...
- java游戏开发杂谈 - 创建一个窗体
package game1; import javax.swing.JFrame; /** * java游戏开发杂谈 * ---demo1:创建一个窗体 * * @author 台哥 * @date ...
- 如何用Eclipse创建一个JavaSwing的项目
创建之前必须先给开发工具安装WindowBuilder插件(安装方法可自行百度) 方式一: 创建项目 new--other--WindowBuilder--SWT Designer----SWT/JF ...
- Java Swing实现一个简单而优美的记事本( 较详细注释 )
Java Swing实现具有基本功能的记事本 目前实现了: 文件 新建 打开 保存 退出前保存询问 编辑 剪切 复制 粘贴 清除 撤销 格式 字体选择 字体颜色选择 帮助 关于 (样式采用了css与h ...
- Swing 是一个为Java设计的GUI工具包
Swing 是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. Swing提供许多比AWT更好的屏幕 ...
- 【良心保姆级教程】java手把手教你用swing写一个学生的增删改查模块
很多刚入门的同学,不清楚如何用java.swing去开发出一个系统? 不清楚如何使用java代码去操作数据库进行增删改查一些列操作,不清楚java代码和数据库(mysql.sqlserver)之间怎么 ...
- 编写Java程序,使用JFrame创建一个窗体
返回本章节 返回作业目录 需求说明: 使用JFrame创建一个窗体 实现思路: 使用JFrame创建窗体的思路 定义一个窗体对象f,窗体名称为"一个简单窗口" 设置窗体左上角与显示 ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
随机推荐
- ASP.NET_各个币种之间的汇率转换(实时)使用Yahoo汇率。
近期开发支付平台的时候有运用到各国的实时汇率之间的转换问题,于是在往上找了很多相关资料,以下就是一些参考网址: 1.提供API接口的网站:https://www.showapi.com:这个网站有提供 ...
- Java MyBatis 插入数据库返回主键
最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...
- Zabbix基本配置及监控主机
监控主机一版需要在被监控的主机上安装Zabbix Agent 监控主机 安装zabbix-agent 首先需要在被监控的主机上安装agent,可以下载预编译好的RPM进行安装,下载地址:http:// ...
- Xamarin与Visual stuido2015离线安装包分享
最近看见大伙留言才知道国内安装Xamarin开发原来这么艰辛啊! 第一:网速不快 第二:Android SDK下载受限 等等... 鉴于这些原因,特写下这篇文章以及分享打包好的离线包以帮助大家尽快体验 ...
- javascript中变量提升的理解
网上找了两个经典的例子 var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); // 10 var ...
- 由js apply与call方法想到的js数据类型(原始类型和引用类型)
原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...
- 代码的坏味道(18)——依恋情结(Feature Envy)
坏味道--依恋情结(Feature Envy) 特征 一个函数访问其它对象的数据比访问自己的数据更多. 问题原因 这种气味可能发生在字段移动到数据类之后.如果是这种情况,你可能想将数据类的操作移动到这 ...
- VS2015在创建项目时的一些注意事项
一.下面是在创建一个新的项目是我最常用的,现在对他们一一做一个详细的介绍: 1.Win32控制台应用程序我平时编写小的C/C++程序都用它,它应该是用的最多的. 2.名称和解决方案名称的区别:名称是项 ...
- 在你的ASP.NET MVC中使用查找功能
在程序中,使用查找功能是少之不了.今天在ASP.NET环境下演示一回. 在cshtml视图中,有三个文本框,让用户输入关键词,然后点击最右连的“搜索”铵钮,如果有结果将显示于下面. Html: 表格放 ...
- java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单; 技术:313596790freemaker模版技术 ,0个代码不用写 ...