如何使用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 ...
随机推荐
- CYQ.Data、ASP.NET Aries 百家企业使用名单
如果您或您所在的公司正在使用此框架,请联系左侧的扣扣,告知我信息,我将为您添加链接: 以下内容为已反馈的用户,(收集始于:2016-08-08),仅展示99家: 序号 企业名称 企业网址 备注 1 山 ...
- Android Ormlite 学习笔记1 -- 基础
Ormlite 是一个开源Java数据实体映射框架.其中依赖2个核心类库: 1.ormlite-android-4.48.jar 2.ormlite-core-4.48.jar 新建项目,引用上面2个 ...
- gulp详细入门教程
本文链接:http://www.ydcss.com/archives/18 gulp详细入门教程 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优 ...
- CSS垂直居中的11种实现方式
今天是邓呆呆球衣退役的日子,在这个颇具纪念意义的日子里我写下自己的第一篇博客,还望前辈们多多提携,多多指教! 接下来,就进入正文,来说说关于垂直居中的事.(以下这11种垂直居中的实现方式均为笔者在日常 ...
- 破解SQLServer for Linux预览版的3.5GB内存限制 (RHEL篇)
微软发布了SQLServer for Linux,但是安装竟然需要3.5GB内存,这让大部分云主机用户都没办法尝试这个新东西 这篇我将讲解如何破解这个内存限制 要看关键的可以直接跳到第6步,只需要替换 ...
- java中易错点(一)
由于replaceAll方法的第一个参数是一个正则表达式,而"."在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换成"/".如果想替换的只是&qu ...
- Android中访问sdcard路径的几种方式
以前的Android(4.1之前的版本)中,SDcard路径通过"/sdcard"或者"/mnt/sdcard"来表示,而在JellyBean(安卓4.1)系统 ...
- Android中Fragment与Activity之间的交互(两种实现方式)
(未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...
- XAMARIN ANDROID 二维码扫描示例
现在二维码的应用越来越普及,二维码扫描也成为手机应用程序的必备功能了.本文将基于 Xamarin.Android 平台使用 ZXing.Net.Mobile 做一个简单的 Android 条码扫描示 ...
- T-SQL学习记录
T-sql是对SQL(structure query language )的升级.可以加函数. 系统数据库:master管理数据库.model模版数据库,msdb备份等操作需要用到的数据库,tempd ...