Visualizzazione risultati 1 fino 16 di 16

Discussione: [Java]Gestione bottone

  1. #1
    Guest

    Cool [Java]Gestione bottone

    Salve gente..
    Ecco un altro piccolo problema che ho incontrato con Java:
    Non riesco a gestire un bottone in modo tale che se premuto appaia una scritta.

    Sapete darmi una mano?

    Thanks..

  2. #2
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Senza uno straccio di codice credo sia un po' difficile...

  3. #3
    Guest

    Predefinito

    Per adesso, essendo agli inizi, l'interfaccia è posizionata "tipo visual basic" ma per adesso non mi importa:
    Codice:
    import javax.swing.*;
    import java.awt.*;
    
    class MyFrame extends JFrame{
    
    	JLabel testocentrato = new JLabel("NUMERI PRIMI COMPRESI");
    	JLabel left = new JLabel("TRA");
    	JLabel right = new JLabel("E");
    	JTextField tra = new JTextField();
    	JTextField e = new JTextField();
    	JButton send = new JButton("Stampa");
    	public MyFrame() {
    		super("Numeri primi - Created by: Mhatis");
    
    		Container c = this.getContentPane();
    		
    		c.setLayout(null);
    						
        	testocentrato.setBounds(85,10,300,15);
        	c.add(testocentrato);
        	
        	left.setBounds(50,50,300,15);
        	right.setBounds(235,50,300,15);
        	tra.setBounds(10,70,100,20);
        	e.setBounds(185,70,100,20);
        	send.setBounds(210,140,80,20);
        	c.add(left);
        	c.add(tra);
        	c.add(right);
        	c.add(e);
        	c.add(send);
            
            setResizable(false);
    		setSize(300,300);
    		setLocation(100,100);
    		setVisible(true);
    	}
    }
    
    public class Interfaccia_NumeriPrimi{
    	public static void main(String args[]){
     		MyFrame app = new MyFrame();
    	}
    }
    Il programma dovrebbe prendere i valori di "tra" ed "e" ed eseguire una funzione (non presente nel codice sopra) alla pressione del tasto "send".

    Per adesso vorrei sapere: come si gestisce il bottone?
    Ultima modifica di mathis : 28-08-2013 alle ore 22.08.17

  4. #4
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Premetto che non ho mai scritto programmi in Java, comunque dando uno sguardo alla documentazione ufficiale non sembra sia troppo difficile. Anzitutto guardati gli esempi della guida: per eseguire del codice alla pressione del pulsante ti serve una classe che implementi l'interfaccia ActionListener, ovviamente questa dovrà implementare il relativo metodo actionPerformed, cui verrà passata come parametro un'istanza della classe ActionEvent, che potrebbe servirti per dettagli riguardo l'evento in corso (attivazione del pulsante). Nell'esempio della guida la medesima classe usata per costruire il pannello implementa l'interfaccia ActionListener, e il metodo actionPerformed viene richiamato all'attivazione ambedue i pulsanti b1 e b3 (dopo che il listener è stato assegnato a questi ultimi, mediante il metodo addActionListener), e come fa a capire per quale dei due pulsanti è stata scomodata? Semplice: osserva il valore restituito dal metodo getActionCommand del parametro che gli è stato passato, una stringa personalizzabile per ogni pulsante (e immagino anche altri controlli) mediante il metodo setActionCommand. A te quest'ultima cosa non serve, hai solo un pulsante per adesso.
    Quindi è semplice: nel codice che verrà eseguito all'attivazione del pulsante dovrai aggiungere al Container del tuo JFrame il nuovo componente, che però ti consiglio di inizializzare già (tranne che per l'aggiunta) nel costruttore della classe, come fai per gli altri componenti.
    Ultima modifica di karl94 : 29-08-2013 alle ore 00.57.35 Motivo: Piccola correzzione

  5. #5
    Guest

    Predefinito

    Sto facendo diverse prove ma non capisco perché se scrivo così:
    Codice:
    package components;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    class MyFrame extends JFrame implements ActionListener{
    
    	/*JLabel testocentrato = new JLabel("NUMERI PRIMI COMPRESI");
    	JLabel left = new JLabel("TRA");
    	JLabel right = new JLabel("E");
    	JTextField tra = new JTextField(3);
    	JTextField e = new JTextField(3);*/
    	JButton send = new JButton("Stampa");
    	public MyFrame() {
    		super("Numeri primi - Created by: Mathis");
    
    		Container c = this.getContentPane();
    		
    		c.setLayout(null);
    						
        	/*testocentrato.setBounds(85,10,300,15);
        	c.add(testocentrato);
        	
        	left.setBounds(50,50,300,15);
        	right.setBounds(235,50,300,15);
        	tra.setBounds(10,70,100,20);
        	e.setBounds(185,70,100,20);*/
        	send.setBounds(210,140,80,20);
        	/*c.add(left);
        	c.add(tra);
        	c.add(right);
        	c.add(e);*/
        	c.add(send);
            
            setResizable(false);
    		setSize(300,300);
    		setLocation(100,100);
    		setVisible(true);
    		
    	 send.setMnemonic(KeyEvent.VK_D);
         send.setActionCommand("Stampa");
         send.addActionListener(this);
    	}
    public void actionPerformed(ActionEvent e){
    	
        if("Stampa".equals(e.getActionCommand())) {
            send.setEnabled(false);
        }
    }
    }
    
    public class Interfaccia_NumeriPrimi{
    	public static void main(String[] args){
     		MyFrame app = new MyFrame();
    	}
    }
    Quindi con gli spezzoni di codice che non riguardano il bottone commentati, appena premo il bottone viene reso "inattivo" (proprio come voluto) mentre se decommento gli spezzoni no?

  6. #6
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    E non restituisce nessun errore? Nemmeno in runtime? Mi sembra strano. L'unica cosa che noto è che usi il nome e per due variabili differenti, ma all'interno del metodo dovrebbe avere la precedenza il nome del parametro, quindi non capisco perché ci sia questo problema.

  7. #7
    Guest

    Predefinito

    Risolto, a quanto pare JCreator si era "impallato" visto che adesso funziona tutto perfettamente.
    Visto che sono agli inizi con la programmazione ad oggetti di questo tipo (e anche autodidatta) sapresti consigliarmi come impostare il codice per l'aggiunta delle varie istruzioni per restituire i numeri primi?

    PS: Ho già implementato il programma a parte quindi vorrei chiarimenti sull'impostazione del programma orientato agli oggetti

    ---EDIT---

    Non ho proprio risolto visto che funziona solo se faccio run file mentre se premo su run project no
    Ultima modifica di mathis : 29-08-2013 alle ore 01.18.00

  8. #8
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Bella domanda, io solitamente con la programmazione ad oggetti non ottengo mai nulla di soddisfacente: passo dallo scrivere un qualcosa che fa il suo sporco lavoro, ma non ha alcuna struttura ad oggetti intera, al progettare svariati livelli di astrazione che non verranno mai scritti in codice. Dovresti quindi trovare una via di mezzo, compromesso tra astrazione e concreto funzionamento. Per adesso, io costruirei una classe di utilità matematiche in cui includere metodi statici tra cui il calcolo dei numeri primi. Più specificamente userei il crivello di Eratostene, tenendo però anche copia cache dei precedenti risultati calcolati (e magari anche qualcosa di precalcolato, perché no?). Non so però se nelle immense librerie Java sia nascosta una cosa già pronta che fa al caso tuo. Se fosse così sarebbe meglio usare quest'ultima.

  9. #9
    Guest

    Predefinito

    Ok, darò un occhiata
    E per quanto riguarda il fatto che il codice funziona solo se faccio run file mentre non va se faccio run project?
    Sapresti spiegarmi perché?

  10. #10
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Mi spiace, ma non ho la più pallida idea di che IDE tu stia utilizzando (in ogni caso, consulta la relativa documentazione). L'unica volta che ho compilato qualcosa in Java ho usato il compilatore da riga di comando.
    Comunque, controlla: non è che run file esegue l'ultima cosa compilata (senza ricompilare le ultime modifiche)?

  11. #11
    Guest

    Predefinito

    Citazione Originalmente inviato da mathis Visualizza messaggio
    Risolto, a quanto pare JCreator si era "impallato" visto che adesso funziona tutto perfettamente.
    Uso JCreator

    Comunque sapresti dirmi perché mi stampa questo quando faccio run file:
    Errore: il metodo principale non è stato trovato nella classe components.MyFrame. Definire il metodo principale come:
    public static void main(String[] args)
    ?

    Thanks..

  12. #12
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Non so se risolverà il tuo problema, ma provo a darti qualche suggerimento:

    - inserisci una sola classe per ogni file *.java, questa dovrai dichiararla pubblica. Puoi benissimo inserire anche il metodo main() al suo interno: non causa nessun problema

    - se usi lo stesso ActionListener per più pulsanti (come hai predisposto il codice, anche se utilizzi un solo pulsante), non verificare da quale elemento proviene l'evento tramite la sua etichetta (se per qualsiasi motivo l'etichetta cambiasse, non saresti più in grado di usare il pulsante), ma utilizza il riferimento all'oggetto, così:
    Codice:
    public void actionPerformed (ActionEvent event) {
       if (event.getSource() == send) {
          // ... fai quel che devi fare
       }
    }
    - se l'ActionListener è relativamente semplice, puoi pure dichiararlo come classe anonima. La sintassi è po' articolata ma ti permette di scrivere il codice eseguito dal pulsante a ridosso della sua dichiarazione (potrebbe tornare utile in certi casi). Questo è il codice equivalente a quello sopra:
    Codice:
    send.addActionListener (new ActionListener () {
       public void actionPerformed (ActionEvent event) {
          // ... fai quel che devi fare
       }
    });
    Nota che in questo modo non è necessario neanche il controllo della provenienza dell'evento: l'ActionListener così dichiarato può rispondere solamente al pulsante a cui è agganciato.

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  13. #13
    Guest

    Predefinito

    Grazie mille
    Ma nel caso dovessi gestire 2 oggetti dovrei creare un'altra classe per il secondo oggetto o, se dovessi seguire il tuo consiglio, dovrei creare un altro file.java contenente la classe?

    In oltre ho bisogno di lavorare su alcune variabili riferite al primo oggetto.
    Ho provato a fare una cosa del tipo:

    Codice:
    package components;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    
    class Interfaccia_NumeriPrimi extends JFrame implements ActionListener{
    
    	JLabel testocentrato = new JLabel("NUMERI PRIMI COMPRESI");
    	JLabel left = new JLabel("TRA");
    	JLabel right = new JLabel("E");
    	JTextField inizio = new JTextField(3);
    	JTextField fine = new JTextField(3);
    	JButton send = new JButton("Stampa");
    	
    	String jtra="",jfino="";
    	int tra=0,fino=0;
    	JPanel numeri = new JPanel(new BorderLayout());
    	
    	public Interfaccia_NumeriPrimi() {
    		super("Numeri primi - Created by: Mathis");
    
    	    Container c = this.getContentPane();
    		
    		c.setLayout(null);
    						
        	testocentrato.setBounds(85,10,300,15);
        	c.add(testocentrato);
        	
        	left.setBounds(50,50,300,15);
        	right.setBounds(235,50,300,15);
        	inizio.setBounds(10,70,100,20);
        	fine.setBounds(185,70,100,20);
        	send.setBounds(210,140,80,20);
        	c.add(left);
        	c.add(inizio);
        	c.add(right);
        	c.add(fine);
        	c.add(send);
            
            setResizable(false);
    		setSize(300,300);
    		setLocation(100,100);
    		setVisible(true);
    		
    	 send.setMnemonic(KeyEvent.VK_D);
         send.setActionCommand("Stampa");
         send.addActionListener(this);
         
    	}
    public void actionPerformed(ActionEvent e){
    	
        if("Stampa".equals(e.getActionCommand())) {
        	Output print = new Output();
        }
    }
    public static void main(String[] args){
     		Interfaccia_NumeriPrimi app = new Interfaccia_NumeriPrimi();
    }
    }
    
    class Output extends MyFrame{
    	public Output() {
    	   JFrame out = new JFrame();
    	   JLabel put = new JLabel();
    	   
    	   try {
        		jtra = inizio.getText();
        		tra = Integer.parseInt(jtra);
        		jfino = fine.getText();
        		fino = Integer.parseInt(jfino);
    		}catch (Exception ex) {}
        	if(tra<0){
        		tra=0;
        	}
        	if(fino<tra){
        		tra=fino;
        		fino=tra;
        	}
        	for(;tra<=fino;tra++){
        		int i=1;
        		for(int j=2;j<=tra/2;j++){
        			if(tra%j==0){
        				i=0;
        			}
        		}
        		if(i==1){
        			put.setText(tra+" - ");
        			out.add(put);
        		}
        	}
    	    
    	    out.setSize(300,300);
    		out.setLocation(100,100);
    	    out.setVisible(true);
    	}		
    }
    I problemi che si presentano sono:
    1. Perché non riesce a lavorarmi con i dati estrapolati dai TextField? Qualsiasi cosa faccia mi stampa 0.
    2. E possibile aggiornare la finestra senza chiuderla e riaprirla? (Questa parte non è implementata nel codice)
    3. Perché cliccando su send mi apre, oltre alla finestra della classe Output, anche la finestra della classe Interfaccia_NumeriPrimi? :p

    Grazie comunque per l'aiuto..
    Ultima modifica di mathis : 29-08-2013 alle ore 18.55.20

  14. #14
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Citazione Originalmente inviato da mathis Visualizza messaggio
    1. Perché non riesce a lavorarmi con i dati estrapolati dai TextField? Qualsiasi cosa faccia mi stampa 0.
    Perché le variabili tra e fino (oltre a tutti gli oggetti a cui ti interfacci) sono dichiarati in un'altra classe. Trovo strano che quel codice lì non ti dia alcun errore...
    Citazione Originalmente inviato da mathis Visualizza messaggio
    2. E possibile aggiornare la finestra senza chiuderla e riaprirla? (Questa parte non è implementata nel codice)
    Non so se ho capito bene: vuoi stampare i risultati del programma nella stessa finestra in cui inserisci i dati? In questo caso sì: ti basta preparare una JLabel quando costruisci la finestra. Nel momento in cui hai il risultato, basta una chiamata a setText() per stamparlo...
    Citazione Originalmente inviato da mathis Visualizza messaggio
    3. Perché cliccando su send mi apre, oltre alla finestra della classe Output, anche la finestra della classe Interfaccia_NumeriPrimi? :p
    In realtà, a quanto ho capito, il codice dovrebbe lasciare aperta la finestra iniziale e mostrare la finestra della classe Output, dato che nell'ActionListener non specifichi nessuna azione per la finestra iniziale. Se vuoi chiuderla, devi aggiungere un this.setVisible(false); nel metodo actionPerformed().
    Citazione Originalmente inviato da mathis Visualizza messaggio
    Ma nel caso dovessi gestire 2 oggetti dovrei creare un'altra classe per il secondo oggetto o, se dovessi seguire il tuo consiglio, dovrei creare un altro file.java contenente la classe?
    Dipende: se prevedi di riutilizzare il secondo oggetto ampiamente, allora meglio una classe pubblica su un file separato. Viceversa, se devi preparare singole componenti di una finestra (il caso classico è quello della preparazione dei pannelli che la compongono), puoi persino dichiararli come classi interne (dichiararli e costruirli, cioè, all'interno della stessa classe). Ad esempio:
    Codice:
    public class MyFrame extends JFrame {
       // tutti gli elementi della finestra
    
       public MyFrame () {
          Container contents = this.getContentPane();
          contents.setLayout(new BorderLayout());
          ...
          this.add(new NorthPanel(), "North");
          this.add(new CenterPanel(), "Center");
          this.add(new SouthPanel(); "South");
       }
    
       private class NorthPanel extends JPanel {
          public NorthPanel () {
             // inserisci qui i componenti del pannello superiore
          }
       }
    
       private class CenterPanel extends JPanel {
          public CenterPanel () {
             // inserisci qui i componenti del pannello centrale
          }
       }
    
       private class SouthPanel extends JPanel {
          public SouthPanel () {
             // inserisci qui i componenti del pannello inferiore
          }
       }
    
       // altri metodi
    }
    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  15. #15
    Guest

    Predefinito

    Per quanto riguarda la stampa:
    Io vorrei che si aprisse una nuova finestra per la stampa e se l'utente dovesse modificare i valori della prima finestra alla pressione del tasto la seconda si aggiorni con i nuovi valori.
    Quindi chiedevo se si potesse aggiornare invece di chiudere ed aprire nuovamente.

    Grazie..

  16. #16
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    È un po' difficile, ma non impossibile... dovresti dichiarare finestra e le sue componenti come membri della classe eseguibile (o, in alternativa, dichiararli in una classe separata ma rendere accessibili i riferimenti dalla classe principale - bastano i cosiddetti metodi accessóri o "getter").

    Nella classe principale, al momento di visualizzare la risposta, verifichi che la finestra esista già: se così non fosse, puoi creare la finestra e inserirci uno alla volta i componenti al suo interno (si usano gli stessi metodi del costruttore, solo che invocati sull'oggetto finestra appena creato).

    Creata la finestra (o verificato che questa esista), puoi procedere a reimpostare i campi che vuoi modificare.

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •