首先,我们需要回顾一些内容(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的更多相关文章

  1. Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)

    本文将讲解如何做一个类似MyEclipse启动画面的闪屏,为Java Swing应用程序增添魅力. 首先看一下效果图吧, 原理很简单,就是创建一个Dialog,Dialog有一个进度条和一个Label ...

  2. java用户界面—创建一个面板

    先从基础学起 创建一个面板 代码如下: package Day08; import java.awt.FlowLayout; import javax.swing.JButton;import jav ...

  3. java游戏开发杂谈 - 创建一个窗体

    package game1; import javax.swing.JFrame; /** * java游戏开发杂谈 * ---demo1:创建一个窗体 * * @author 台哥 * @date ...

  4. 如何用Eclipse创建一个JavaSwing的项目

    创建之前必须先给开发工具安装WindowBuilder插件(安装方法可自行百度) 方式一: 创建项目 new--other--WindowBuilder--SWT Designer----SWT/JF ...

  5. Java Swing实现一个简单而优美的记事本( 较详细注释 )

    Java Swing实现具有基本功能的记事本 目前实现了: 文件 新建 打开 保存 退出前保存询问 编辑 剪切 复制 粘贴 清除 撤销 格式 字体选择 字体颜色选择 帮助 关于 (样式采用了css与h ...

  6. Swing 是一个为Java设计的GUI工具包

    Swing 是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. Swing提供许多比AWT更好的屏幕 ...

  7. 【良心保姆级教程】java手把手教你用swing写一个学生的增删改查模块

    很多刚入门的同学,不清楚如何用java.swing去开发出一个系统? 不清楚如何使用java代码去操作数据库进行增删改查一些列操作,不清楚java代码和数据库(mysql.sqlserver)之间怎么 ...

  8. 编写Java程序,使用JFrame创建一个窗体

    返回本章节 返回作业目录 需求说明: 使用JFrame创建一个窗体 实现思路: 使用JFrame创建窗体的思路 定义一个窗体对象f,窗体名称为"一个简单窗口" 设置窗体左上角与显示 ...

  9. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

随机推荐

  1. javascript之活灵活现的Array

    前言 就如同标题一样,这篇文章将会灵活的运行Array对象的一些方法来实现看上去较复杂的应用. 大家都知道Array实例有这四个方法:push.pop.shift.unshift.大家也都知道 pus ...

  2. Oracle碎碎念~1

    1. 设置SQL*Plus提示符 SQL> set sqlprompt "_user'@'_connect_identifier>" SYS@orcl> 为了对所 ...

  3. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  4. linux应用调试技术之GDB和GDBServer

    1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDB ...

  5. UVa 122 Trees on the level

    题目的意思: 输入很多个节点,包括路径和数值,但是不一定这些全部可以构成一棵树,问题就是判断所给的能否构成一棵树,且没有多余. 网上其他大神已经给出了题目意思:比如我一直很喜欢的小白菜又菜的博客 说一 ...

  6. ActiveRecord模式整理

    DAO Data Access Object,数据访问对象 DAO是一个软件设计的指导原则,在核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象 ...

  7. EntityFramework 6 + Mysql 生成POCOs

    问题 使用EDMX文件 EF Power Tools参数不正确的解决方法 对于"异常来自 HRESULT:0x80070057 (E_INVALIDARG)",有方法说" ...

  8. 【repost】JS错误类型的学习

    SyntaxError是解析代码时发生的语法错误 // 变量名错误  var 1a;  // 缺少括号  console.log 'hello'); (2)ReferenceError Referen ...

  9. 【初码干货】【Azure系列】1、再次感受Azure,体验Windows Server 2016并部署BlogEngine.NET

    上个月末,在某人的建议下,重新注册了一个1元试用账户(包含1个月期限的1500元订阅),并充值了1000元转为了正式账户,相当于1000元得到了2500的订阅,于是又一次开启了Azure之旅. 在这不 ...

  10. ENode 2.8 最新架构图简介

    ENode架构图 什么是ENode ENode是一个.NET平台下,纯C#开发的,基于DDD,CQRS,ES,EDA,In-Memory架构风格的,可以帮助开发者开发高并发.高吞吐.可伸缩.可扩展的应 ...