📄 tempodial.java
字号:
package javasound;import java.awt.*;import java.awt.geom.*;import java.awt.event.*;import javax.swing.*;import java.util.Vector;import javax.sound.midi.Sequencer;public class TempoDial extends JPanel { private int dotSize = 6; private Ellipse2D ellipse; private Vector data; private Data currentData; private Sequencer sequencer; public TempoDial() { setBackground(new Color(20, 20, 20)); ellipse = new Ellipse2D.Float(2,20,92,120); Vector dots = new Vector(); PathIterator pi = ellipse.getPathIterator(null, 0.9); while ( !pi.isDone() ) { float[] pt = new float[6]; switch ( pi.currentSegment(pt) ) { case FlatteningPathIterator.SEG_MOVETO: case FlatteningPathIterator.SEG_LINETO: dots.add(new Ellipse2D.Float(pt[0],pt[1],dotSize,dotSize)); } pi.next(); } Vector tmp = new Vector(); for (int i = 0; i < dots.size(); i++) { if (((Ellipse2D) dots.get(i)).getY() >= ellipse.getHeight()/2) { tmp.add(dots.get(i)); } } dots.removeAll(tmp); float x = (float) (ellipse.getX() + ellipse.getWidth()/2); float y = (float) (ellipse.getY() + (ellipse.getHeight()/2)); Vector paths = new Vector(dots.size()); for (int i = 0; i < dots.size(); i++) { GeneralPath gp = new GeneralPath(GeneralPath.WIND_NON_ZERO); gp.moveTo(x, y); Ellipse2D e1 = (Ellipse2D) dots.get(i); gp.lineTo((float) e1.getX(), (float) e1.getY()); if (i+1 < dots.size()) { Ellipse2D e2 = (Ellipse2D) dots.get(i+1); gp.lineTo((float) e2.getX(), (float) e2.getY()); } gp.closePath(); paths.add(gp); } data = new Vector(paths.size()); for (int i = 0, tempo = 40; i < paths.size(); i++, tempo+=10) { data.add(new Data(tempo, dots.get(i), paths.get(i))); if (tempo == 120) { currentData = (Data) data.lastElement(); } } addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { processMouse(e); } }); addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { processMouse(e); } }); } private void processMouse(MouseEvent e) { if (ellipse.contains(e.getPoint())) { for (int i = 0; i < data.size(); i++) { currentData = (Data) data.get(i); if (currentData.path.contains(e.getPoint())) { break; } } repaint(); if (sequencer != null) { sequencer.setTempoInBPM((float) getTempo()); } } } public void setSequencer(Sequencer sequencer) { this.sequencer = sequencer; } public float getTempo() { return ((float) currentData.tempo); } public void setTempo(float tempo) { for (int i = 0; i < data.size(); i++) { currentData = (Data) data.get(i); if (currentData.tempo == tempo) { break; } } repaint(); } public void paint(Graphics g) { Dimension d = getSize(); Graphics2D g2 = (Graphics2D) g; g2.setBackground(getBackground()); g2.clearRect(0, 0, d.width, d.height); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); double x = ellipse.getWidth()/2+ellipse.getX()+dotSize/2; double y = ellipse.getHeight()/2; double x2 = currentData.dot.getX() + dotSize/2; double y2 = currentData.dot.getY() + dotSize/2; Ellipse2D e = new Ellipse2D.Double(x-5,y-5,10,10); Color jfcBlue = new Color(204, 204, 255); g2.setColor(jfcBlue); g2.setStroke(new BasicStroke(3)); g2.draw(new Line2D.Double(e.getX()+5, e.getY()+5, x2, y2)); g2.fill(e); g2.setFont(new Font("serif", Font.BOLD, 12)); g2.drawString(String.valueOf(currentData.tempo) + " bpm", 2, 12); g2.fill(currentData.dot); g2.setStroke(new BasicStroke(1.5f)); g2.setColor(jfcBlue.darker()); for (int i = 0; i < data.size(); i++) { g2.draw(((Data) data.get(i)).dot); } } public Dimension getPreferredSize() { return new Dimension(105,70); } public Dimension getMaximumSize() { return getPreferredSize(); } class Data extends Object { int tempo; Ellipse2D dot; GeneralPath path; public Data(int tempo, Object dot, Object path) { this.tempo = tempo; this.dot = (Ellipse2D) dot; this.path = (GeneralPath) path; } } public static void main(String argv[]) { JFrame f = new JFrame("Tempo Dial"); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); f.getContentPane().add("Center", new TempoDial()); f.pack(); f.setSize(new Dimension(200,140)); f.setVisible(true); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -