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