如何使用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)

 1 JFrame frame=new JFrame(); 

  • 创建组件

1 JButton button=new JButton(“click me”);

  • 将组件添加到frame上

1 frame.getContentPane.add(BorderLayout.EAST,button);

  • 显示出来

 1 frame.setSize(300,300);

2 frame.setVisible(true); 

3.布局管理器(layout Managers)

首先,布局管理器是与特定组件相关联的java对象,他大多数是背景组件。

其次,布局管理器是用来控制所关联组件上携带的其他组件,换言之,如果某个框架带有面板,面板上有按钮的情况下,则面板布局管理器就是控制按钮的大小与位置,而框架的布局管理器是控制着面板的大小与位置。

将对应的按键添加到对应的面板上,可以如下实现:

 1 JPanel jpanel=new JPanel();   

2 JButton button=new JButton(“click me”);

3 jpanel.add(button); 

4.三大首席管理器:

  • border
  • flow
  • box

    1)BorderLayout该管理器会将组建分割成5个区域,每个区域只能放置一个组件,由此管理员安置的组件不会取得默认的大小。这个也是框架默认得布局管理器;

    2)FlowLayout:该管理器的行为与文书处理程序的版面配置方式差不多。这个组件会依照理想的大小呈现,并且胡依照从左到右,依次加入的顺序(中间可能会换行)排列,因此如果组建放不下一行的时候会自动换行。这个是面板默认得布局管理器。

    3)BoxLayout:它就像FlowLayout一样让每个组件按照默认得大小,依次按照加入的顺序进行排列,它是以垂直的方式排列(也可以水平,但是通常我们只关心垂直的方式)。与FlowLayout不 同的是,它是需要插入某种换行的机制来强制组件从新的一列进行排列。

     接下来我们看一下干货:    

3 import java.awt.BorderLayout;
  4 import java.awt.GridLayout;
  5 import java.awt.Label;
  6 import java.awt.event.ActionEvent;
  7 import java.awt.event.ActionListener;
  8 import java.util.ArrayList;
  9 
 10 import javax.sound.midi.*;
 11 import javax.swing.*;
 12 
 13 public class BeatBox {
 14     JPanel mainJPanel;
 15     ArrayList<JCheckBox> checkboxslist;
 16     Sequencer sequencer;
 17     Sequence sequence;
 18     Track track;
 19     JFrame theFrame;
 20     String[]instrumentNames={
 21             "Bass Drum","closed Hi-Hat","open Hi-Hat","Acoustic Snare",
 22             "Crash Cymbal","Hand Clap","High Tome","Hi Bongo","Maracas",
 23             "Whistal","Low Conga","Cowbell","Vibraslap","Low_mid Tom",
 24             "High Agogo","open High Coga"
 25     };//乐器的名称,用String的array维护
 26     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
 27     public static void main(String[] args) {
 28         // TODO Auto-generated method stub
 29        new BeatBox().buildGUI();
 30     }
 31     public void buildGUI(){
 32         theFrame = new JFrame("Cyber BeatBox");
 33         theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭时关闭程序
 34         BorderLayout layout = new BorderLayout();//定义了一个BorderLayout面板对象
 35         JPanel background=new JPanel(layout);//将面板对象实例化JPanel对象
 36         background.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));//用于设置边缘空白大小
 37         
 38         checkboxslist=new ArrayList<JCheckBox>();
 39         Box buttonBox = new Box(BoxLayout.Y_AXIS);        
 40         
 41         JButton start = new JButton("start");
 42         start.addActionListener(new MyStartlistener());
 43         buttonBox.add(start);
 44         
 45         JButton stop = new JButton("stop");
 46         start.addActionListener(new MyStoplistener());
 47         buttonBox.add(stop);
 48         
 49         JButton upTempo = new JButton("Tempo up");
 50         start.addActionListener(new MyupTempolistener());
 51         buttonBox.add(upTempo);
 52         
 53         JButton downTempo = new JButton("Tempo down");
 54         start.addActionListener(new MydownTempolistener());
 55         buttonBox.add(downTempo);
 56         
 57         Box nameBox=new Box(BoxLayout.Y_AXIS);
 58         for(int i=0;i<16;i++){
 59             nameBox.add(new Label(instrumentNames[i]));
 60         }
 61         
 62         background.add(BorderLayout.EAST,buttonBox);
 63         background.add(BorderLayout.WEST,nameBox);
 64         
 65         theFrame.getContentPane().add(background);
 66         
 67         GridLayout gridLayout=new GridLayout(16,16);//创建具有指定行数和列数的网格布局。 布局中的所有组件都具有相等的大小。
 68                                            //行和列中的一个(但不是两者)可以为零,这意味着任何数量的对象都可以放置在一行或一列中。
 69         gridLayout.setVgap(1);//将组件之间的垂直间距设置为指定的值。
 70         gridLayout.setHgap(2);//将组件之间的水平间距设置为指定的值。
 71         mainJPanel=new JPanel(gridLayout);
 72         background.add(BorderLayout.CENTER,mainJPanel);
 73         
 74         for(int i=0;i<256;i++){
 75             JCheckBox checkBox=new JCheckBox();
 76             checkBox.setSelected(false);
 77             checkboxslist.add(checkBox);
 78             mainJPanel.add(checkBox);
 79         }//结束循环
 80         //创建checkBox组,并将其设定成未勾选的false,并添加到arraylist以及面板上
 81         
 82         setUpMidi();
 83         
 84         theFrame.setBounds(50, 50, 300, 300);
 85         theFrame.pack();//pack()函数:使此窗口的大小适合其子组件的首选大小和布局。 如果任一维度小于由上次调用setMinimumSize方法指定的最小大小,则会自动放大窗口的最终宽度和高度。
 86                           //如果窗口和/或其所有者不可显示,则在计算优选大小之前使它们两者都可显示。 窗口在计算其大小后生效。
 87         theFrame.setVisible(true);
 88     }//关闭buildGUI()方法
 89     
 90     public void setUpMidi(){
 91         try{
 92             
 93             sequencer= MidiSystem.getSequencer();//此方法等效于调用getSequencer(true) 创建sequencer
 94             sequencer.open();
 95             //创建并打开队列
 96             
 97             sequence=new Sequence(Sequence.PPQ, 4);
 98             track=sequence.createTrack();
 99             //创建队列并track
100             
101             sequencer.setTempoInBPM(120);
102             
103         }catch(Exception e){
104             e.printStackTrace();
105         }
106     }//关闭 setUpMidi()方法
107     
108     public void buildTrackAndStart(){
109         
110         int []trackList=null;//创建出16个元素的数组来存储一项乐器值,如果有该演奏,其值就将会是关键字值,否则将值为零
111         
112         sequence.deleteTrack(track);        
113         track=sequence.createTrack();//清除旧的track,做一个新的
114         
115         for (int i = 0; i < 16; i++) {//每个乐器执行一次
116             trackList=new int[16];
117             
118             int key=instrument[i];//设代表乐器的关键字
119             
120             for(int j = 0;j<16;j++){//每一拍执行一次
121                 JCheckBox jc=(JCheckBox)checkboxslist.get(j+16*i);
122                 if(jc.isSelected()){//如果勾选,那么关键字的值放到数组得该位置上,不然的话,就补零
123                     trackList[j]=key;
124                 }else{
125                     trackList[j]=0;
126                 }
127             }//关闭循环
128             
129             makeTracks(trackList);
130             track.add(makeEvent(176,1,127,0,16));//创建此乐器事件,并添加到track上;
131         }//关闭外循环
132         
133         
134         track.add(makeEvent(192,9,1,0,15));
135         
136         try{
137             sequencer.setSequence(sequence);
138             sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);
139             sequencer.start();
140             sequencer.setTempoInBPM(120);//以每分钟的拍数设置速度。 播放的实际速度是指定值和速度因子的乘积。
141         }catch(Exception e){
142             e.printStackTrace();
143         }
144     }//结束buildTrackAndStart方法
145     
146     public class MyStartlistener implements ActionListener{
147         //按钮的监听者
148         @Override
149         public void actionPerformed(ActionEvent e) {
150             // TODO Auto-generated method stub
151             buildTrackAndStart();
152         }
153         
154     }//内部类关闭
155     public class MyStoplistener implements ActionListener{
156         //按钮的监听者
157         @Override
158         public void actionPerformed(ActionEvent e) {
159             // TODO Auto-generated method stub
160             sequencer.stop();
161         }
162         
163     }//内部类关闭
164     public class MyupTempolistener implements ActionListener{
165         //按钮的监听者
166         @Override
167         public void actionPerformed(ActionEvent e) {
168             // TODO Auto-generated method stub
169             float tempoFactor=sequencer.getTempoFactor();
170             sequencer.setTempoFactor((float)(tempoFactor*1.03));//节奏因子,预设为1.0,每次调整3%
171         }
172         
173     }//内部类关闭
174     public class MydownTempolistener implements ActionListener{
175         //按钮的监听者
176         @Override
177         public void actionPerformed(ActionEvent e) {
178             // TODO Auto-generated method stub
179             float tempoFactor=sequencer.getTempoFactor();
180             sequencer.setTempoFactor((float)(tempoFactor*.97));//节奏因子,预设为1.0,每次调整3%
181         }
182         
183     }//内部类关闭
184     public void makeTracks(int []list){
185         
186         for (int i = 0; i < 16; i++) {
187             int key=list[i];
188             if (key!=0) {
189                 track.add(makeEvent(144,9,key,100,i));
190                 track.add(makeEvent(128,9,key,100,i+1));//创建Note on以及Note off,并添加到track上
191             }
192         }
193     }//关闭makeTracks方法
194     public MidiEvent makeEvent(int comd,int chan,int one,int two,int tick){
195          MidiEvent event=null;
196          try{
197              ShortMessage shortMessage=new ShortMessage();//创建消息实例
198              shortMessage.setMessage(comd, chan, one, two);//调用setMessage
199              event=new MidiEvent(shortMessage, tick);//制作消息的MidiEvent实例
200          }catch(Exception e){
201              e.printStackTrace();
202          }
203         return event;
204     }//关闭makeEvent方法,该方法是制作消息以及事件
205 }

 

   对应的界面呈现为:

    

问:框架为什么不能像面板那样直接加上组件呢?

      答:JFrame会这么特殊是因为它是让无显示在画面上的接点。

      因为Swing的组件纯粹是由Java构成的,JFrame必须要连接到底层的操作系统以便于存储显示装置。我们可以把面板想做是安置在JFrame上的100%的java层,或者把JFrame想作是支撑面板的框架,他甚至可以使用 自定义的方式换掉框架的面板: 

1  nyframe.setContentpane(myPanel);

 

 

 

转载于:https://www.cnblogs.com/lujun1949/p/6248728.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
### 回答1: Salesforce REST API 的 Python 客户端通常指用于连接到 Salesforce 的 Python 库。使用这些库可以在 Python 中轻松调用 Salesforce REST API,从而在 Python 中执行 Salesforce 操作。 常用的 Python 库包括: - simple-salesforce:一个简单的库,可用于调用 Salesforce REST API。 - beatbox:Salesforce 官方提供的 Python 库,可用于调用 Salesforce SOAP API。 - pyforce:另一个用于调用 Salesforce SOAP API 的 Python 库。 使用这些库的方法因库而异,但通常都需要先安装库,然后使用库提供的函数或方法来调用 Salesforce REST API。 例如,使用 simple-salesforce 库时,可以使用以下代码来连接到 Salesforce: ``` from simple_salesforce import Salesforce sf = Salesforce(username='USERNAME', password='PASSWORD', security_token='SECURITY_TOKEN') ``` 然后,可以使用 sf 对象的相关方法来调用 Salesforce REST API,例如: ``` # 获取账户列表 accounts = sf.query("SELECT Id, Name FROM Account") ``` 注意,使用 Salesforce REST API 需要先在 Salesforce 中配置 API 访问权限。另外,使用 Salesforce SOAP API 需要在 Salesforce 中启用 API。 ### 回答2: Salesforce REST API的Python客户端是一种用于与Salesforce平台进行通信和交互的工具。它允许开发人员使用Python编程语言来访问Salesforce的数据和功能。 该客户端提供了一组Python类和方法,使开发人员能够通过REST API与Salesforce进行通信。它包含了许多有用的功能,例如在Salesforce中创建、读取、更新和删除记录,执行SOQL查询和SOSL搜索,处理批量操作等等。 使用该Python客户端,开发人员可以方便地使用Python代码来编写自动化任务和集成Salesforce数据到他们的应用程序中。他们可以使用自己喜欢的Python开发环境,例如PyCharm、Visual Studio Code等,来编写和调试他们的代码。 该客户端还提供了一些便利的功能,例如在请求中包含头文件、处理错误和异常、处理身份验证和会话管理等。这些功能大大简化了开发人员与Salesforce进行交互的过程,提高了开发效率。 总之,Salesforce REST API的Python客户端是一个强大且易于使用的工具,它使开发人员能够使用Python编程语言与Salesforce平台进行通信,访问和操作Salesforce的数据和功能。它为开发人员提供了许多便捷的功能,使他们能够更加轻松地开发和集成Salesforce应用程序。 ### 回答3: Salesforce是一个领先的云计算平台,它提供了一组强大的API,包括REST API,用于与Salesforce平台进行交互。REST API是一种设计简单、易于使用的Web服务API,它允许开发人员使用HTTP方法(如GET、POST、PUT、DELETE)对Salesforce中的数据和对象执行操作。 Python是一种简单易学、功能强大的编程语言,被广泛用于Web开发和数据处理任务。Salesforce的REST API可以与Python进行集成,以便开发人员可以使用Python语言编写代码来访问和操作Salesforce数据。 为了使用Salesforce REST API的Python客户端,我们可以使用Python中的第三方库,如Simple Salesforce或Python Salesforce库。这些库提供了一组API调用,使我们可以通过Python代码访问Salesforce数据。 使用Python客户端,我们可以执行以下操作: 1. 认证和建立与Salesforce平台的连接。 2. 使用GET请求来检索Salesforce中的数据,如对象、记录和字段。 3. 使用POST请求来创建新的记录或对象。 4. 使用PUT请求来更新现有记录或对象。 5. 使用DELETE请求删除记录或对象。 6. 处理异常和错误,确保代码的稳定性和可靠性。 7. 处理分页和查询结果集大小限制。 8. 处理Salesforce的限制和配额,以便在提交请求时遵循合理的频率。 通过使用Salesforce REST API的Python客户端,我们可以轻松地与Salesforce平台进行集成和交互,创建自定义应用程序和脚本。无论是使用Salesforce平台的数据、记录或对象,还是执行各种操作,如创建、更新或删除,Python客户端都可以满足我们的需求。 总之,Salesforce REST API的Python客户端是一个强大而灵活的工具,它使开发人员能够使用Python语言轻松访问和操作Salesforce的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值