|
|
|
|
Strumenti |
23-03-2009, 17:06 | #1 |
Senior Member
Iscritto dal: Jan 2008
Città: Bologna
Messaggi: 2179
|
[java] JFrame + JApplet + audio
Nella foto sotto, a sx c'è un applet che ho creato indipendente e a dx un frame che ho creato sempre in modo indipendente uno dall' altro.
Quello che volevo fare era vedere all' interno della finestra che genera il frame "titolo canzone" e i tasti play ecc, come nell' applet. Il codice non genera errore però non riesco nell' intento. Secondo me sbaglio qualcosa nel comunicare cosa voglio inserire all' interno della finesta che genera il frame. Altrimenti non so spiegarmelo. Dove sbaglio?? di seguito inserisco il codice: Codice:
import java.applet.AudioClip; import java.awt.BorderLayout; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.MalformedURLException; import java.net.URL; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class NewFrame extends JFrame { public NewFrame (String titolo, int posX, int posY, int width, int height) { // titolo frame this.setTitle(titolo); // posizione frame this.setLocation(posX, posY); // dimensione frame this.setSize(width, height); // gestione chiusura this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args){ // creazione istanza NewFrame myFrame = new NewFrame("Titolo del frame", 20, 20, 300, 200); // visualizzazione myFrame.setVisible(true); } public class Audio extends JApplet implements ActionListener { private AudioClip clip; private JButton play, stop, loop, ok; private JPanel buttonPanel; public void paint(Graphics g) { g.drawString("titolo canzone", 20, 30); } public void init() { // se non mettessi il try catch l' audio non si sentirebbe try { clip = getAudioClip(new URL( getDocumentBase(), "one for you, one for me.wav")); } catch(MalformedURLException muEx) { System.out.println("*** Invalid URL! ***"); System.exit(1); } play = new JButton("Play"); play.addActionListener(this); stop = new JButton("Stop"); stop.addActionListener(this); loop = new JButton("Loop"); loop.addActionListener(this); ok = new JButton("ok"); ok.addActionListener(this); buttonPanel = new JPanel(); buttonPanel.add(play); buttonPanel.add(stop); buttonPanel.add(loop); buttonPanel.add(ok); add(buttonPanel,BorderLayout.SOUTH); } public void stop() { clip.stop(); //Prevents sound from continuing } //after applet has been stopped. public void actionPerformed(ActionEvent event) { if (event.getSource() == play) clip.play(); if (event.getSource() == stop) clip.stop(); if (event.getSource() == loop) clip.loop(); } } } Grazie.
__________________
CM 690 Pure w || ROG Crosshair III || AMD || OCZ Gold || Ati || ciao Kiu... || LOST addicted - 2004 ♥ 2010 1900 S.S.LAZIO |
23-03-2009, 17:37 | #2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
A meno che non mi sfugga una linea direi: non è che sbagli nel comunicare, è che proprio non comunichi .
Devi fare al JFrame quello che fai all'applet, non far diventare l'applet classe interna del tuo jframe. Esempio: Codice:
import java.awt.*; import javax.swing.*; public class Main { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new MainFrame().edtShow(); } }); } } class MainFrame { public void edtShow() { JFrame frame = new JFrame("Titolo del frame"); frame.setContentPane(new MainContentPane().createPanel()); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.pack(); frame.setVisible(true); } } class MainContentPane { public JPanel createPanel() { JButton play = new JButton("Play"); JButton stop = new JButton("Stop"); JButton loop = new JButton("Loop"); JLabel title = new JLabel("Titolo canzone"); title.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); JPanel buttons = new JPanel(new FlowLayout()); buttons.add(play); buttons.add(stop); buttons.add(loop); JPanel panel = new JPanel(new BorderLayout()); panel.add(title, BorderLayout.NORTH); panel.add(buttons, BorderLayout.SOUTH); return panel; } }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
24-03-2009, 16:10 | #3 |
Senior Member
Iscritto dal: Jan 2008
Città: Bologna
Messaggi: 2179
|
Sbagliavo alla grande insomma
Grazie della correzione , ho capito il codice anche se ho tolto @Override perchè altrimenti mi dava errore, e ci ho messo un pò a capire EventQueue.invokeLater(new Runnable() { public void run() { new MainFrame().edtShow(); } }); mi spiazzava il ; dopo le parentesi perchè non riuscivo a capire da dove arrivasse e a chi servisse. Codice:
// il ; è dell involeLater, lo chiude. Con invokeLater istanzio l' interfaccia Runnable e poi sempre al suo interno definisco il run al quale gli passo il metodo edtShow della classe MainFrame Sta sera o domani provo a modificare il codice per fargli prendere un file audio, speriamo di riuscirci. Non dovrei commettere lo stesso errore 2 volte.
__________________
CM 690 Pure w || ROG Crosshair III || AMD || OCZ Gold || Ati || ciao Kiu... || LOST addicted - 2004 ♥ 2010 1900 S.S.LAZIO |
24-03-2009, 16:24 | #4 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
giusto. Quella che uso (e che si usa normalmente) è una forma contratta detta creazione di istanza di classe interna locale anonima. Si può espandere in:
Codice:
class MyRunnable implements Runnable { public void run() { ...eccetera } } MyRunnable runnableInstance = new MyRunnable(); EventQueue.invokeLater(runnableInstance); @Override è un'annotazione introdotta in Java 5, marca un metodo che ne sovrascriva un altro, ha lo scopo di permettere al compilatore di verificare se ci sia una divergenza tra intenzione (voglio sovrascrivere qualcosa) e realizzazione (magari sbaglio una lettera e creo un nuovo metodo anzichè sovrascriverne uno esistente).
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:49.