Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [Java] applicazione java che implementa una sveglia

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

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Non ho letto tutto il codice ma c'è abbastanza roba da correggere.

    Intanto separa ... spezza, incapsula in più classi. Hai fatto una mega-classe Sveglia1 che fa di tutto e di più ... dalla gestione della interfaccia utente all'I/O su file alla gestione degli eventi alla gestione di un thread alla gestione dei suoni. Così è un macello ..... dico davvero.

    Non usare
    c.add("North",titolo);

    Nella documentazione questo add è indicato come obsoleto (tuttavia non è stato deprecato). E non passare la stringa esplicita "North", ci sono già le costanti in BorderLayout.

    In sostanza andrebbe usato:
    c.add(titolo, BorderLayout.NORTH);

    Non parliamo poi del metodo getDirectory() che hai fatto .... dato un java.io.File se vuoi ottenere il "parente" (per un file è la directory), basta semplicemente usare getParent() o getParentFile() di java.io.File!!

    E non mettere, cablando/componendo nel sorgente, path assoluti come

    index=new File("C:"+File.separator+"Programmi"+File.separato r+"Sveglia");
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.