第一个GUI~
package GUI;
import javax.swing.*;
public class SimpleGui1 {
public static void main(String[] args) {
JFrame frame = new JFrame();
JButton button = new JButton("Click me");
//这一行程序会在window关闭时把程序结束掉
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//把Button加到frame的pane上
frame.getContentPane().add(button);
//设定frame的大小
frame.setSize(300, 300);
//最后把frame显示出来
frame.setVisible(true);
}
}
下一步应该给按钮添加功能
1.按钮被按下时要执行的方法
2.检测按钮被按下的方法
如果想要知道按钮的事件,就会监听事件的接口
监听接口是介于监听(你)与事件源(按钮)间的桥梁
取得按钮的ActionEvent
1.实现ActionListener这个接口
2.向按钮注册(告诉他你要监听的事件)
3.定义事件处理的方法(实现接口上的方法)
//按下按钮圆圈就会改变颜色
package GUI;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleGui3C implements ActionListener{
JFrame frame;
public static void main(String[] args){
SimpleGui3C gui = new SimpleGui3C();
gui.go();
}
public void go(){
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton button = new JButton("Change colors");
//向按钮注册
button.addActionListener(this);
MyDrawPanel drawPanel = new MyDrawPanel();
frame.getContentPane().add(BorderLayout.SOUTH,button);
frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
frame.setSize(300, 300);
frame.setVisible(true);
}
//实现Interface上的方法
public void actionPerformed(ActionEvent event) {
frame.repaint();
}
}
class MyDrawPanel extends JPanel {
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
int red = (int)(Math.random()*255);
int green = (int)(Math.random()*255);
int blue = (int)(Math.random()*255);
Color startColor = new Color(red, green, blue);
red = (int)(Math.random()*255);
green = (int)(Math.random()*255);
blue = (int)(Math.random()*255);
Color endColor = new Color(red, green, blue);
GradientPaint gradient = new GradientPaint(70, 70, startColor, 150, 150, endColor);
g2d.setPaint(gradient);
g2d.fillOval(70, 70, 100, 100);
}
}
程序料理 制作音乐录像带,使用Java随机产生的圆形来跟着寄走跳舞
这个非GUI的事件会向事件源注册而由音乐本身来出发。
这个程序需要以下几个功能:
1.制作一系列的MIDI信息/事件来播放任意的钢琴音
1.制作一系列的MIDI信息/事件来播放任意的钢琴音
2.对事件注册一个监听者
3.开始sequecer的播放操作
4.每当监听者的事件处理程序调用时,在面板画面上画一个随机的方块并调用repaint
制作程序的三个阶段阶段:
第一版:简单的制作出MIDI事件
第二版:注册并监听事件,但没有图形。从命令行中每一排对应输出一个数据
第三版:最终版本,第二版基础上加上图形输出
第一版:
package MiniMusicPlayer;
import javax.sound.midi.*;
public class MiniMusicPlayer1 {
public static void main(String[] args) {
try {
// 创建并打开队列
Sequencer sequencer = MidiSystem.getSequencer();
sequencer.open();
// 创建队列并track
Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();
// 创建一堆连续的音符事件
for(int i = 5; i < 61; i+= 4) {
// 调用makeEvent()来产生信息和时间然后把他们加到track上
track.add(makeEvent(144,1,i,100, i));
track.add(makeEvent(128,1,i,100,i+2));
}//结束循环
// 开始播放
sequencer.setSequence(seq);
sequencer.setTempoInBPM(220);
sequencer.start();
} catch (Exception ex) {ex.printStackTrace();}
}
public static MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) {
MidiEvent event = null;
try {
ShortMessage a = new ShortMessage();
a.setMessage(comd, chan, one, two);
event = new MidiEvent(a, tick);
} catch (Exception e) {}
return event;
}
}
第二版
package MiniMusicPlayer;
import javax.sound.midi.*;
//我们必须要监听ControllerEvent,因此实现了这个接口
public class MiniMusicPlayer2 implements ControllerEventListener{
public static void main (String[] args) {
MiniMusicPlayer2 mini = new MiniMusicPlayer2();
mini.go();
}
public void go(){
try{
Sequencer sequencer =MidiSystem.getSequencer();
sequencer.open();
// 向sequencer注册事件。注册的方法取用监听者与代表想要临听的事件的Int数组,我们只需要127事件
int[] eventsIWant = {127};
sequencer.addControllerEventListener(this, eventsIWant);
Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();
for (int i= 5; i<60; i+=4) {
track.add(makeEvent(144,1,i,100,i));
// 插入事件为127的自定义ControllEvent(176)它不会做任何事件,只是让我们知道有音符在播放,因为它的Tick跟NOTE ON
// 是同时进行的
track.add(makeEvent(176,1,127,0,i));
track.add(makeEvent(128,1,i,100,i+2));
}//结束循环
sequencer.setSequence(seq);
sequencer.setTempoInBPM(220);
sequencer.start();
} catch (Exception e) { e.printStackTrace();}
}
// 获知事件时在命令打印出字符串的事件处理程序
public void controlChange(ShortMessage event) {
System.out.println("la");
}
public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) {
MidiEvent event = null;
try{
ShortMessage a = new ShortMessage();
a.setMessage(comd, chan, one, two);
event = new MidiEvent(a, tick);
} catch(Exception e) {};
return event;
}
}
第三版
package MiniMusicPlayer;
import javax.sound.midi.*;
import javax.swing.*;
import java.awt.*;
public class MiniMusicPlayer3 {
static JFrame f = new JFrame("My First Music Video");
static MyDrawPanel ml;
public static void main (String[] args) {
MiniMusicPlayer3 mini = new MiniMusicPlayer3();
mini.go();
}
public void setUpGui() {
ml = new MyDrawPanel();
f.setContentPane(ml);
f.setBounds(30,30,300,300);
f.setVisible(true);
}
public void go(){
setUpGui();
try{
Sequencer sequencer =MidiSystem.getSequencer();
sequencer.open();
// 向sequencer注册事件。注册的方法取用监听者与代表想要临听的事件的int数组,我们只需要127事件
sequencer.addControllerEventListener(ml, new int[] {127});
Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();
int r = 0;
for (int i= 5; i<60; i+=4) {
r= (int)((Math.random()*50));
track.add(makeEvent(144,1,r,100,i));
// 插入事件为127的自定义ControllEvent(176)它不会做任何事件,只是让我们知道有音符在播放,因为它的Tick跟NOTE ON
// 是同时进行的
track.add(makeEvent(176,1,127,0,i));
track.add(makeEvent(128,1,r,100,i+2));
}//结束循环
sequencer.setSequence(seq);
sequencer.setTempoInBPM(220);
sequencer.start();
} catch (Exception e) { e.printStackTrace();}
}
public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) {
MidiEvent event = null;
try{
ShortMessage a = new ShortMessage();
a.setMessage(comd, chan, one, two);
event = new MidiEvent(a, tick);
} catch(Exception e) {};
return event;
}
class MyDrawPanel extends JPanel implements ControllerEventListener {
/**
*
*/
private static final long serialVersionUID = 1L;
boolean msg = false;
public void controlChange(ShortMessage event) {
msg = true ;
repaint();
}
public void paintComponent(Graphics g) {
if (msg) {
Graphics2D g2 = (Graphics2D) g;
int r = (int)(Math.random()*250);
int gr = (int)(Math.random()*250);
int b = (int) (Math.random()*250);
g2.setColor(new Color(r,gr,b));
int ht =(int) ((Math.random()*120)+10);
int width = (int)((Math.random()*120)+10);
int x = (int)((Math.random()*40)+10);
int y = (int)((Math.random()*40)+10);
g2.fillRect(x, y, ht, width);
msg = false;
}
}
}
}
最终效果图:![]()