1 GUI
package MIDI;
import javax.swing.*;
public class SimpeGui1 {
public static void main(String[] args) {
JFrame frame = new JFrame();
JButton button = new JButton("click me");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(button);
frame.setSize(300,300);
frame.setVisible(true);
}
}
GUI默认有五个区域可以安置widget(东南西北中),每个区域只能安放一项,但是还可以放上面板。
frame.getContentPane().add(button);
frame.getContentPane().add(BoderLayout.CENTER, button);
若只有单一参数add()会自动把widget加到中心区域。
2 事件的监听
监听接口是介于监听(你)与事件源(按钮)间的桥梁。
1.实现ActionListener这个接口。
2.向按钮注册(告诉它你要监听事件)。
3.定义事件处理的方法(实现接口上的方法)。
import javax.swing.*;
import java.awt.event.*;
public class SimpeGui1B implements ActionListener {
JButton button;
public static void main (String[] args) {
SimpeGui1B gui = new SimpeGui1B();
gui.go();
}
public void go() {
JFrame frame = new JFrame();
button = new JButton("click me");
button.addActionListener(this);
frame.getContentPane().add(button);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame.setVisible(true);
}
/*
1.简单来说@override注解是告诉编译器,下面的方法是重写父类的方法
2.如果不写@override注解去直接重写方法,编译器是不会判断你是不是正确重写了父类中的方法的。
如重写方法时参数与父类不同,程序是不会提示报错的。这会留下一个潜在的bug。
当你写了@override注解时,程序会判断你是否正确的重写了父类的对应方法。
而且加上此注解后,程序会自动屏蔽父类的方法。
*/
@Override
//实现interface上的方法,这是真正处理事件的办法
public void actionPerformed(ActionEvent event) {
button.setText("I've been clicked!");
}
}
监听获知事件
事件源发出事件
事件对象携带事件信息
3 在GUI上面加东西的3种方法
1.在frame上放置widget
加上按钮、窗体、radio botton等
frame.getContentPane().add(myButton);
javax.swing有许多widget
2.在widget上绘制2D图形
使用graphics对象来绘制图形
graphics.fillOval(70, 70, 100, 100);
Java2D API
3.在widget上绘制JPEG图
graphics.drawImage(myPic, 10, 10, this);
4 JPanel
JPanel的大小默认为填满frame。颜色默认黑色。
g参数所引用的对象实际上是个Graphics2D的实例。
Graphics2D比Graphics功能更多。
要使用Graphics2D的方法就得向下转型:
Graphics2D g2d = (Graphics2D) g;
import java.awt.*;
import javax.swing.*;
public class MyDrawPanel extends JPanel {
public void paintComponent(Graphics g) {
g.fillRect(0,0,this.getWidth(),this.getHeight());
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
Color randomColor = new Color(red, green, blue);
g.setColor(randomColor);
g.fillOval(70,70,100,100);
}
}
5 内部类
内部类可以自由存取外部的所有方法,就算是私有的也一样。
内部类的实例一定会绑在外部类的实例上。
class MyOuterClass() {
MyInner inner = new MyInner();
class MyInnerClasss() {
}
}
//从外部类以外的程序代码来初始化内部实例
class Foo {
public static void main(String[] args){
MyOuter outerObj = new MyOuter();
MyOuter.MyInner innerObj = outerObj.new MyInner();
}
}
6 多重监听
内外部的类可以搞定不同的继承层次
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TwoButtons {
JFrame frame;
JLabel label;
public static void main (String[] args) {
TwoButtons gui = new TwoButtons();
gui.go();
}//end main1
public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton labelButton = new JButton("Change Label");
labelButton.addActionListener(new LabelListener());
JButton colorButton = new JButton("Change Circle");
colorButton.addActionListener(new ColorListener());
label = new JLabel("I'm a label");
MyDrawPanel drawPanel = new MyDrawPanel();
frame.getContentPane().add(BorderLayout.SOUTH, colorButton);
frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
frame.getContentPane().add(BorderLayout.EAST, labelButton);
frame.getContentPane().add(BorderLayout.WEST, label);
frame.setSize(300, 300);
frame.setVisible(true);
}//end go
class LabelListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
label.setText("Ouch!");
}
}//end LabelListener
class ColorListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
frame.repaint();
}
}//end LabelListener
}
7 内部类执行动画效果
package MIDI;
import javax.swing.*;
import java.awt.*;
public class SimpleAnimation {
int x = 70;
int y = 70;
public static void main (String[] args) {
SimpleAnimation gui = new SimpleAnimation();
gui.go();
}
public void go() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyDrawPanel drawPanel = new MyDrawPanel();
frame.getContentPane().add(drawPanel);
frame.setSize(300, 300);
frame.setVisible(true);
for (int i = 0;i <130; i++) {
x++;
y++;
drawPanel.repaint();
try {
Thread.sleep(50);
} catch (Exception ex) {}
}//end for
}//end go
class MyDrawPanel extends JPanel {
public void paintComponent(Graphics g) {
g.setColor(Color.white);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.green);
g.fillOval(x,y,80,80);
}
}
}
8 监听非GUI事件
import javax.sound.midi.*;
import java.io.*;
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.addControllerEventListener(ml, new int[] {127});
Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();
int r = 0;
for(int i = 0;i <60;i +=4) {
r = (int)((Math.random() * 50) + 1);
track.add(makeEvent(144, 1, r, 100, i));
track.add(makeEvent(176, 1, 127, 0, i));
track.add(makeEvent(128, 1, r, 100, i+2));
}//end for
sequencer.setSequence(seq);
sequencer.setTempoInBPM(120);
sequencer.start();
} catch (Exception ex) {ex.printStackTrace();}
}//end go
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;
}//end event;
class MyDrawPanel extends JPanel implements ControllerEventListener {
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() * 25);
int gr = (int) (Math.random() * 25);
int b = (int) (Math.random() * 25);
g.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);
g.fillRect(x,y,ht,width);
msg = false;
}
}
}
}