Ciao ragazzi, vi è mai capitato di stare giocando al pc e non accorgervi che state facendo tardi perchè magari avevate un altro impegno? a me spesso, così ho deciso di realizzare (perchè non ho proprio nulla da fare!) una sveglia (che implementa anche un conteggio alla rovescia) ma non riesco proprio a pensare ad un algoritmo giusto che mi aiuti per la sveglia.
Di seguito metto il codice dell'intera classe (probabilmente, per come l'ho fatto , funziona solo su windows...)
suggerimenti e migliorie sono sempre ben accetti
codice:import java.util.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import javax.sound.midi.*; class Sveglia1 extends JFrame implements Runnable{ private Container c; private Thread tr; private int form=24; private boolean sveglia=false; private boolean finito=false; private JMenuBar barra=new JMenuBar(); private JMenu file=new JMenu("File"); private JMenu modi=new JMenu("Modifica"); private JMenuItem reim=new JMenuItem("Reimposta Sveglia"); private JMenuItem annu=new JMenuItem("Annulla"); private JMenuItem camb=new JMenuItem("Cambia Modo"); private JMenuItem esci=new JMenuItem("Esci"); private JMenuItem formato=new JMenuItem("Formato ora"); private JMenuItem info=new JMenuItem("Informazioni"); private JMenuItem suono=new JMenuItem("Suono"); private JLabel rovescia=new JLabel("--:--:--"); private JButton ok=new JButton("OK"); private JButton stop=new JButton("Stop"); private JTextField ore=new JTextField("hh",6); private JTextField minuti=new JTextField("mm",6); private JComboBox ap=new JComboBox(); private JPanel p=new JPanel(); private JPanel p1=new JPanel(); private JPanel p2=new JPanel(); private JLabel titolo=new JLabel("Conteggio alla rovescia"); private String smin=""; private Sequencer se; private File f; private File cart; private File index; private File canzone; private boolean AM=true; public Sveglia1(){ try{ tr=new Thread(this); //caricamento del file con le impostazioni index=new File("C:"+File.separator+"Programmi"+File.separator+"Sveglia"); if(!index.exists()){ index.mkdir(); System.out.println("Creata cartella Sveglia"); } f=new File(index.getAbsolutePath()+File.separator+"impo.khj"); if(!f.exists()){ f.createNewFile(); System.out.println("creato file impostazioni"); FileWriter fw= new FileWriter(f); PrintWriter pw=new PrintWriter(fw); pw.println("Formato _12"); pw.flush(); pw.println("Suoneria _C:"+File.separator+"Programmi"+File.separator+"Sveglia"+File.separator+"sottofondo2.mid"); pw.flush(); pw.println("Sveglia _no"); pw.close(); System.out.println("impostazioni iniziali inserite"); } FileReader fr=new FileReader(f); BufferedReader br=new BufferedReader(fr); String a=br.readLine(); a=a.substring(a.indexOf('_')+1); form=Integer.parseInt(a); a=br.readLine(); canzone=new File(a.substring(a.indexOf('_')+1)); cart=new File(getDirectory(canzone)); a=br.readLine(); a=a.substring(a.indexOf('_')+1); if(a.equals("si")){ sveglia=true; titolo.setText("Sveglia"); rovescia.setVisible(false); } else ap.setVisible(false); c=this.getContentPane(); this.setJMenuBar(barra); barra.add(file); barra.add(modi); file.add(reim); file.add(camb); file.add(annu); file.addSeparator(); file.add(info); file.add(esci); modi.add(formato); modi.add(suono); c.setLayout(new BorderLayout(0,0)); c.add("North",titolo); c.add("South",p); p.setLayout(new BorderLayout()); p.add("West",p1); p.add("Center",ap); p.add("East",ok); p.add("South",p2); p1.setLayout(new FlowLayout(FlowLayout.CENTER,0,10)); p1.add(ore); p1.add(minuti); p2.setLayout(new FlowLayout(FlowLayout.CENTER,50,0)); p2.add(rovescia); p2.add(stop); stop.setVisible(false); ap.addItem("AM"); ap.addItem("PM"); minuti.requestFocus(); this.setSize(300,200); this.setLocation(300,300); this.setTitle("Sveglia!"); this.setVisible(true); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); ore.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ if(ore.getText().equals("hh")) ore.setText(""); } }); minuti.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ if(minuti.getText().equals("mm")) minuti.setText(""); } }); ok.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ ok.setEnabled(false); ore.setEnabled(false); minuti.setEnabled(false); stop.setVisible(true); formato.setEnabled(false); suono.setEnabled(false); camb.setEnabled(false); tr.start(); } }); info.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ try{ FileReader fr=new FileReader(f); BufferedReader br=new BufferedReader(fr); String a; while((a=br.readLine()) != null) System.out.println(a); fr.close(); br.close(); } catch(Exception ex){System.out.println("c'è qlks k nn va!");} } }); esci.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.exit(0); } }); stop.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ reset(); } }); annu.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ reset(); } }); ap.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ if(((String) ap.getSelectedItem()).equals("AM")) AM=true; else AM=false; } }); camb.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ if(sveglia){ sveglia=false; ap.setVisible(false); titolo.setText("Conteggio alla rovescia"); } else{ sveglia=true; if(form==12) ap.setVisible(true); titolo.setText("Sveglia"); } cambiaImpostazioni(); } }); formato.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ String risp=JOptionPane.showInputDialog("Il formato attuale è "+form+" h: cambiarlo? (s/n)"); if("s".equals(risp)){ if(form==12){ form=24; ap.setVisible(false); } else{ form=12; ap.setVisible(true); } cambiaImpostazioni(); } } }); suono.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ JFileChooser fc=new JFileChooser(); fc.setApproveButtonText("Scegli"); /*FileFilter filter = new FileFilter("mid"); filter.setDescription("MIDI files"); fc.addChoosableFileFilter(filter); fc.setFileFilter(filter);*/ fc.setCurrentDirectory(cart); int value=fc.showOpenDialog(null); if(value==JFileChooser.APPROVE_OPTION) if((canzone=fc.getSelectedFile())!= null){ cart=new File(getDirectory(canzone)); cambiaImpostazioni(); } } }); } catch(Exception e){e.printStackTrace();} } public void cambiaImpostazioni(){ try{ File appo=new File(getDirectory(f)+File.separator+"temp.tmp"); appo.createNewFile(); FileWriter fw= new FileWriter(appo); PrintWriter pw=new PrintWriter(fw); pw.println("Formato _"+form); pw.flush(); pw.println("Suoneria _"+canzone.getAbsolutePath()); pw.flush(); String appo2; if(sveglia) appo2="si"; else appo2="no"; pw.println("Sveglia _"+appo2); pw.flush(); pw.close(); f.delete(); appo.renameTo(f); f=appo; appo.delete(); } catch(Exception e1){ e1.printStackTrace(); } } public String getDirectory(File file){ String appo; String path=""; StringTokenizer st=new StringTokenizer(file.getPath(),File.separator); for(int i=0; i<=st.countTokens();i++){ appo=st.nextToken(); if(!path.equals("")) path=path+File.separator+appo; } return path; } public void stop(){ if(se != null) se.stop(); tr=null; } public void suona(){ try{ MidiFileFormat mff2=MidiSystem.getMidiFileFormat(canzone); Sequence S=MidiSystem.getSequence(canzone); se=MidiSystem.getSequencer(); se.open(); se.setSequence(S); se.start(); } catch(MidiUnavailableException ecc){} catch(InvalidMidiDataException ecc2){} catch(IOException ecc3){} } private int preparaSveglia(){ int nOre=0; int nMin=0; GregorianCalendar gc=new GregorianCalendar(); if("hh".startsWith(ore.getText()) || "".equals(ore.getText()) || "mm".startsWith(minuti.getText()) || "".equals(minuti.getText())){ JOptionPane.showMessageDialog(this,"Hai inserito un formato delle ore non valido, per favore reiserisci l'ora"); reset(); } else{ int appMins=Integer.parseInt(minuti.getText()); int appOre=Integer.parseInt(ore.getText()); if(appMins>60 || appMins<0 || appOre>24 || appOre<0){ int oraAttuale=gc.get(Calendar.HOUR_OF_DAY); int minsAttuali=gc.get(Calendar.MINUTE); if(form==12) if(!AM) appOre+=12; if(minsAttuali>appMins) if(oraAttuale>=appOre){ JOptionPane.showMessageDialog(this,"Hai inserito un orario precedente all'attuale, per favore reiserisci l'ora"); reset(); } else{ nOre=appOre-oraAttuale-1; nMin=appMins+(60-minsAttuali); } else if(oraAttuale>appOre){ JOptionPane.showMessageDialog(this,"Hai inserito un orario precedente all'attuale, per favore reiserisci l'ora"); reset(); } else{ nOre=appOre-oraAttuale; nMin=appMins-minsAttuali; } } return nMin*60 + nOre*3600; } private int preparaConteggio(){ int nOre=0; int nMin=0; if("hh".startsWith(ore.getText()) || "".equals(ore.getText())) nOre=0; else if("mm".startsWith(minuti.getText()) || "".equals(minuti.getText())){ JOptionPane.showMessageDialog(this,"Hai inserito un formato delle ore non valido, per favore reiserisci l'ora"); reset(); } else nOre=Integer.parseInt(ore.getText()); nMin=Integer.parseInt(minuti.getText()); return (nMin*60)+(nOre*3600); } public void run(){ int nOre=0; int nMin=0; int secTot=0; if(sveglia) secTot = preparaSveglia(); else secTot = preparaConteggio(); while(secTot != 0){ if(((nSec=secTot%60)==0) && nMin!=0){ nSec=59; nMin-=1; if((nMin%60==0) && nOre!=0) nOre-=1; } try{ tr.sleep(1000); } catch(Exception e){ System.out.println("Errore nello sleep"); tr=null; tr=new Thread(this); } secTot-=1; rovescia.setText(nOre+":"+nMin+":"+nSec); } suona(); rovescia.setText("FINITO!!!"); } public void reset(){ ok.setEnabled(true); ore.setEnabled(true); minuti.setEnabled(true); stop.setVisible(false); rovescia.setText("--:--:--"); minuti.setText("mm"); ore.setText("hh"); formato.setEnabled(true); suono.setEnabled(true); camb.setEnabled(true); try{ stop(); tr.stop(); tr=null; tr=new Thread(); } catch(Exception eccezione){ eccezione.printStackTrace(); } } public static void main(String [] args){ Sveglia1 s=new Sveglia1(); } }

) una sveglia (che implementa anche un conteggio alla rovescia) ma non riesco proprio a pensare ad un algoritmo giusto che mi aiuti per la sveglia.
Rispondi quotando