JAVA简明摘要(十二)看图说故事(图形用户接口)

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;
            }
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值