📄 juke.java
字号:
g2.setFont(font24); g2.drawString(currentName, 5, fm28.getHeight()-5); if (duration <= 0.0) { loading.render(d, g2); } else { double seconds = getSeconds(); if (midiEOM || audioEOM) { seconds = duration; } if (seconds > 0.0) { g2.setFont(font42); String s = String.valueOf(seconds); s = s.substring(0,s.indexOf('.')+2); int strW = (int) fm42.getStringBounds(s, g2).getWidth(); g2.drawString(s, d.width-strW-9, fm42.getAscent()); int num = 30; int progress = (int) (seconds / duration * num); double ww = ((double) (d.width - 10) / (double) num); double hh = (int) (d.height * 0.25); double x = 0.0; for ( ; x < progress; x+=1.0) { g2.fill(new Rectangle2D.Double(x*ww+5, d.height-hh-5, ww-1, hh)); } g2.setColor(jfcDarkBlue); for ( ; x < num; x+=1.0) { g2.fill(new Rectangle2D.Double(x*ww+5, d.height-hh-5, ww-1, hh)); } } } } } public void start() { pbThread = new Thread(this); pbThread.setName("PlaybackMonitor"); pbThread.start(); } public void stop() { if (pbThread != null) { pbThread.interrupt(); } pbThread = null; } public void run() { while (pbThread != null) { try { pbThread.sleep(99); } catch (Exception e) { break; } repaint(); } pbThread = null; } } // End PlaybackMonitor /** * Table to display the name of the sound. */ class JukeTable extends JPanel implements ActionListener { TableModel dataModel; JFrame frame; JTextField textField; JButton applyB; public JukeTable() { setLayout(new BorderLayout()); setPreferredSize(new Dimension(260,300)); final String[] names = { "#", "Name" }; dataModel = new AbstractTableModel() { public int getColumnCount() { return names.length; } public int getRowCount() { return sounds.size();} public Object getValueAt(int row, int col) { if (col == 0) { return new Integer(row); } else if (col == 1) { Object object = sounds.get(row); if (object instanceof File) { return ((File) object).getName(); } else if (object instanceof URL) { return ((URL) object).getFile(); } } return null; } public String getColumnName(int col) {return names[col]; } public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } public boolean isCellEditable(int row, int col) { return false; } public void setValueAt(Object aValue, int row, int col) { } }; table = new JTable(dataModel); TableColumn col = table.getColumn("#"); col.setMaxWidth(20); table.sizeColumnsToFit(0); JScrollPane scrollPane = new JScrollPane(table); EmptyBorder eb = new EmptyBorder(5,5,2,5); scrollPane.setBorder(new CompoundBorder(eb,new EtchedBorder())); add(scrollPane); JPanel p1 = new JPanel(); JMenuBar menuBar = new JMenuBar(); menuBar.setBorder(new BevelBorder(BevelBorder.RAISED)); JMenu menu = (JMenu) menuBar.add(new JMenu("Add")); String items[] = { "File or Directory of Files", "URL" }; for (int i = 0; i < items.length; i++) { JMenuItem item = menu.add(new JMenuItem(items[i])); item.addActionListener(this); } p1.add(menuBar); menuBar = new JMenuBar(); menuBar.setBorder(new BevelBorder(BevelBorder.RAISED)); menu = (JMenu) menuBar.add(new JMenu("Remove")); JMenuItem item = menu.add(new JMenuItem("Selected")); item.addActionListener(this); item = menu.add(new JMenuItem("All")); item.addActionListener(this); p1.add(menuBar); loopB = addButton("loop", p1); loopB.setBackground(Color.gray); loopB.setSelected(true); add("South", p1); } private JButton addButton(String name, JPanel p) { JButton b = new JButton(name); b.addActionListener(this); p.add(b); return b; } private void doFrame(String titleName) { int w = 500; int h = 130; JPanel panel = new JPanel(new BorderLayout()); JPanel p1 = new JPanel(); if (titleName.endsWith("URL")) { p1.add(new JLabel("URL :")); textField = new JTextField("http://foo.bar.com/foo.wav"); textField.addActionListener(this); } else { p1.add(new JLabel("File or Dir :")); String sep = String.valueOf(System.getProperty("file.separator").toCharArray()[0]); String text = null; try { text = System.getProperty("user.dir") + sep; } catch (SecurityException ex) { reportStatus(ex.toString()); JavaSound.showInfoDialog(); return; } textField = new JTextField(text); textField.setPreferredSize(new Dimension(w-100, 30)); textField.addActionListener(this); } p1.add(textField); panel.add(p1); JPanel p2 = new JPanel(); applyB = addButton("Apply", p2); addButton("Cancel", p2); panel.add("South", p2); frame = new JFrame(titleName); frame.getContentPane().add("Center", panel); frame.pack(); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation(d.width/2 - w/2, d.height/2 - h/2); frame.setSize(w, h); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { Object object = e.getSource(); if (object instanceof JTextField) { applyB.doClick(); } else if (object instanceof JMenuItem) { JMenuItem mi = (JMenuItem) object; if (mi.getText().startsWith("File")) { doFrame("Add File or Directory"); } else if (mi.getText().equals("URL")) { doFrame("Add URL"); } else if (mi.getText().equals("Selected")) { int rows[] = table.getSelectedRows(); Vector tmp = new Vector(); for (int i = 0; i < rows.length;i++) { tmp.add(sounds.get(rows[i])); } sounds.removeAll(tmp); tableChanged(); } else if (mi.getText().equals("All")) { sounds.clear(); tableChanged(); } } else if (object instanceof JButton) { JButton button = (JButton) e.getSource(); if (button.getText().equals("Apply")) { String name = textField.getText().trim(); if (name.startsWith("http") || name.startsWith("file")) { try { sounds.add(new URL(name)); } catch (Exception ex) { ex.printStackTrace(); }; } else { loadJuke(name); } tableChanged(); } else if (button.getText().equals("Cancel")) { frame.dispose(); frame = null; errStr = null; playbackMonitor.repaint(); } else if (button.getText().equals("loop")) { loopB.setSelected(!loopB.isSelected()); loopB.setBackground(loopB.isSelected() ? Color.gray : Color.lightGray); } startB.setEnabled(sounds.size() != 0); } } public void tableChanged() { table.tableChanged(new TableModelEvent(dataModel)); } } // End JukeTable /** * Animation thread for when an audio file loads. */ class Loading extends Thread { double extent; int incr; public void run() { extent = 360.0; incr = 10; while (true) { try { sleep(99); } catch (Exception ex) { break; } playbackMonitor.repaint(); } } public void render(Dimension d, Graphics2D g2) { if (isAlive()) { FontRenderContext frc = g2.getFontRenderContext(); TextLayout tl = new TextLayout("Loading", g2.getFont(), frc); float sw = (float) tl.getBounds().getWidth(); tl.draw(g2, d.width-sw-45, d.height-10); double x = d.width-33, y = d.height-30, ew = 25, eh = 25; g2.draw(new Ellipse2D.Double(x,y,ew,eh)); g2.fill(new Arc2D.Double(x,y,ew,eh,90,extent,Arc2D.PIE)); if ((extent -= incr) < 0) { extent = 350.0; } } } } /** * Animation thread for the contributors of Java Sound. */ class Credits extends Thread { int x; Font font16 = new Font("serif", Font.PLAIN, 16); String contributors = "Contributors : Kara Kytle, " + "Jan Borgersen, " + "Brian Lichtenwalter"; int strWidth = getFontMetrics(font16).stringWidth(contributors); public void run() { x = -999; while (!playbackMonitor.isShowing()) { try { sleep(999); } catch (Exception e) { return; } } for (int i = 0; i < 100; i++) { try { sleep(99); } catch (Exception e) { return; } } while (true) { if (--x < -strWidth) { x = playbackMonitor.getSize().width; } playbackMonitor.repaint(); try { sleep(99); } catch (Exception ex) { break; } } } public void render(Dimension d, Graphics2D g2) { if (isAlive()) { g2.setFont(font16); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); g2.drawString(contributors, x, d.height-5); } } } public static void main(String args[]) { String media = "./audio"; final Juke juke = new Juke(args.length == 0 ? media : args[0]); juke.open(); JFrame f = new JFrame("Juke Box"); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} public void windowIconified(WindowEvent e) { juke.credits.interrupt(); } }); f.getContentPane().add("Center", juke); f.pack(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int w = 750; int h = 340; f.setLocation(screenSize.width/2 - w/2, screenSize.height/2 - h/2); f.setSize(w, h); f.setVisible(true); if (args.length > 0) { File file = new File(args[0]); if (file == null && !file.isDirectory()) { System.out.println("usage: java Juke audioDirectory"); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -