Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110

    Array di Char [i] e corrispondenza con ciclo for(int i;...)

    Ciao,
    sto svolgendo un esercizio in cui mi si chiede di creare un cifrario per sostituzione.
    Nello specifico:

    Scrivere un'applicazione che implementi una codifica per sostituzione. Occorerà un'area di testo, al centro della finestra, che non possa essere modificata. Quest'area di testo mostrerà la codifica, in un formato come A->C, B->Q, C->F etc. Ciò significa che A verrebbe sostituita da C, B da Q, C da F etc. Il codice sarà generato una lettera alla volta dalla A alla Z. Dovranno essere presenti 26 pulsanti. Il primo specificherà la lettera da sostituire alla A, il secondo alla B etc etc.
    Dopo la pressione del pulsante, si aggiunga la sostituzione corrispondente e si nasconda il pulsante premuto.
    Ora, io ho un problema nella creazione dell'actionPerformed perché, dato un array char[] alfabeto contenente tutte le lettere e un ciclo for per scandagliare tale array, quando digito il tasto A, invece di farmi apparire "a -->A" mi fa apparire "z-->A".
    Cosa sbaglio? Grazie

    Ecco il codice (e in rosso la parte in questione)

    codice:
    package interfacceutentegrafiche;
    
    
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    
    
    public class CodificaSostituzione extends JFrame implements ActionListener {
    
    
    	public static final int LARGHEZZA = 500;
    	public static final int ALTEZZA = 300;
    	public static final int RIGHE = 2;
    	public static final int CARATTERI_PER_RIGA = 40;
    	
    	private JTextArea testo;
    	private char[] alfabeto = "abcdefghilmnopqrstuvz".toCharArray();
    	
    	public CodificaSostituzione(){
    		super();
    		
    		setTitle("Codifica per sostituzione!");
    		setSize(LARGHEZZA,ALTEZZA);
    		
    		Container pannelloGrande = getContentPane();
    		pannelloGrande.setBackground(Color.LIGHT_GRAY);
    		
    		JPanel pannelloLettere = new JPanel();
    		pannelloLettere.setBackground(Color.LIGHT_GRAY);
    		setLayout(new FlowLayout());
    		add(pannelloLettere,"North");
    		
    		JButton A = new JButton("A");
    		A.setBackground(Color.LIGHT_GRAY);
    		A.addActionListener(this);
    		add(A);
    		
    		JButton B = new JButton("B");
    		B.setBackground(Color.LIGHT_GRAY);
    		B.addActionListener(this);
    		add(B);
    		
    		JButton C = new JButton("C");
    		C.setBackground(Color.LIGHT_GRAY);
    		C.addActionListener(this);
    		add(C);
    		
    		JButton D = new JButton("D");
    		D.setBackground(Color.LIGHT_GRAY);
    		D.addActionListener(this);
    		add(D);
    		
    		JButton E = new JButton("E");
    		E.setBackground(Color.LIGHT_GRAY);
    		E.addActionListener(this);
    		add(E);
    		
    		JButton F = new JButton("F");
    		F.setBackground(Color.LIGHT_GRAY);
    		F.addActionListener(this);
    		add(F);
    		
    		JButton G = new JButton("G");
    		G.setBackground(Color.LIGHT_GRAY);
    		G.addActionListener(this);
    		add(G);
    		
    		JButton H = new JButton("H");
    		H.setBackground(Color.LIGHT_GRAY);
    		H.addActionListener(this);
    		add(H);
    		
    		JButton I = new JButton("I");
    		I.setBackground(Color.LIGHT_GRAY);
    		I.addActionListener(this);
    		add(I);
    		
    		JButton L = new JButton("L");
    		L.setBackground(Color.LIGHT_GRAY);
    		L.addActionListener(this);
    		add(L);
    		
    		JButton M = new JButton("M");
    		M.setBackground(Color.LIGHT_GRAY);
    		M.addActionListener(this);
    		add(M);
    		
    		JButton N = new JButton("N");
    		N.setBackground(Color.LIGHT_GRAY);
    		N.addActionListener(this);
    		add(N);
    		
    		JButton O = new JButton("O");
    		O.setBackground(Color.LIGHT_GRAY);
    		O.addActionListener(this);
    		add(O);
    		
    		JButton P = new JButton("P");
    		P.setBackground(Color.LIGHT_GRAY);
    		P.addActionListener(this);
    		add(P);
    		
    		JButton Q = new JButton("Q");
    		Q.setBackground(Color.LIGHT_GRAY);
    		Q.addActionListener(this);
    		add(Q);
    		
    		JButton R = new JButton("R");
    		R.setBackground(Color.LIGHT_GRAY);
    		R.addActionListener(this);
    		add(R);
    		
    		JButton S = new JButton("S");
    		S.setBackground(Color.LIGHT_GRAY);
    		S.addActionListener(this);
    		add(S);
    		
    		JButton T = new JButton("T");
    		T.setBackground(Color.LIGHT_GRAY);
    		T.addActionListener(this);
    		add(T);
    		
    		JButton U = new JButton("U");
    		U.setBackground(Color.LIGHT_GRAY);
    		U.addActionListener(this);
    		add(U);
    		
    		JButton V = new JButton("V");
    		V.setBackground(Color.LIGHT_GRAY);
    		V.addActionListener(this);
    		add(V);
    		
    		JButton Z = new JButton("Z");
    		Z.setBackground(Color.LIGHT_GRAY);
    		Z.addActionListener(this);
    		add(Z);
    		
    		JPanel pannelloTesto = new JPanel();
    		pannelloTesto.setBackground(Color.LIGHT_GRAY);
    		testo = new JTextArea(RIGHE, CARATTERI_PER_RIGA);
    		testo.setBackground(Color.WHITE);
    		pannelloTesto.add(testo);
    		add(pannelloTesto,"South");
    	}
    	
    	
    	public void actionPerformed(ActionEvent e){
    		for(int i=0; i<21;i++){
    			if(e.getActionCommand()=="A"){	
    			testo.setText(alfabeto[i] + "--> A");
    			}
    		}
    	}
    	
    	
    	
    	
    	
    	
    	
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		CodificaSostituzione sostituzione = new CodificaSostituzione();
    		sostituzione.setVisible(true);
    		
    
    
    	}
    
    
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    quando digito il tasto A, invece di farmi apparire "a -->A" mi fa apparire "z-->A".
    Cosa sbaglio?
    Questo è abbastanza ovvio: il if(e.getActionCommand()=="A") lo fai dentro il ciclo. Se premi "A" quindi la condizione è true e la ripeti per 21 volte. Solo che il setText effettivo è quello dell'ultimo ciclo, dove alfabeto[i] è chiaramente la "z".
    Rivedi la logica (non so bene cosa volevi fare ...).


    Comunque, in generale:

    1) La ripetizione per 21 volte della impostazione dei pulsanti non va granché bene, si può (e deve) ridurre! Immagina come .... hai un array di lettere ...

    2) Non usare costanti letterali per i constraint di BorderLayout. Usa le sue costanti in BorderLayout:

    add(pannelloLettere,"North"); // No

    add(pannelloLettere, BorderLayout.NORTH); // Sì

    3) e.getActionCommand()=="A" è corretto (con == ) in questo momento ma solo "per caso" perché hai le stesse stringhe letterali usate per dare il testo ai JButton. In generale, usa equals()
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Questo è abbastanza ovvio: il if(e.getActionCommand()=="A") lo fai dentro il ciclo. Se premi "A" quindi la condizione è true e la ripeti per 21 volte. Solo che il setText effettivo è quello dell'ultimo ciclo, dove alfabeto[i] è chiaramente la "z".
    Rivedi la logica (non so bene cosa volevi fare ...).
    Argh, vero! Ho risolto così:

    codice:
    private int i = 0; (in cima alla classe)
    
    public void actionPerformed(ActionEvent e){
    			if(i<22){
    			testo.setText(alfabeto[i] + "--> " + e.getActionCommand());
    			i++;
    			}
    Ora vorrei nascondere il bottone una volta cliccato... come fare?
    Visto che il e.getButton restituisce la stringa col nome del bottone, ho provato a fare così:

    codice:
    e.getActionCommand().setVisible(false)
    ma niente perché giustamente mi vede e.getActionCommand() come semplice String... come posso fare?
    Grazie


    Comunque, in generale:

    1) La ripetizione per 21 volte della impostazione dei pulsanti non va granché bene, si può (e deve) ridurre! Immagina come .... hai un array di lettere ...
    Ci provo e vediamo cosa esce

    2) Non usare costanti letterali per i constraint di BorderLayout. Usa le sue costanti in BorderLayout:

    add(pannelloLettere,"North"); // No

    add(pannelloLettere, BorderLayout.NORTH); // Sì


    Sul libro che sto usando dice che è equivalente... ci sono problemi particolari?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    codice:
    private int i = 0; (in cima alla classe)
    
    public void actionPerformed(ActionEvent e){
    			if(i<22){
    			testo.setText(alfabeto[i] + "--> " + e.getActionCommand());
    			i++;
    			}
    E cosa è (e serve) questa variabile i ? Perché è uno "stato" esterno alla gestione del actionPerformed ... quindi come viene (e da chi) gestito? La questione è lì ...

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Ora vorrei nascondere il bottone una volta cliccato... come fare?
    Tutti i componenti hanno setVisible(boolean)

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    codice:
    e.getActionCommand().setVisible(false)
    Il action command è una stringa ... ovviamente NON ha un setVisible !

    Tutti gli oggetti XyzEvent hanno:

    public Object getSource()

    Il source è fornito come Object ma se l'evento l'ha originato un JButton, quel source è il riferimento appunto a quel JButton. Quindi si può usare il source se il listener non deve sapere nulla di specifico.


    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Sul libro che sto usando dice che è equivalente... ci sono problemi particolari?
    Se scrivi esattamente "North" sì, sono equivalenti come risultato.
    Ma c'è una differenza IMPORTANTISSIMA.

    Se ti sbagli a scrivere es. "Nirth" e non te ne accorgi, il sorgente compila ma poi la applicazione NON ti funziona o NON si presenta correttamente.
    Se ti sbagli a scrivere es. BorderLayout.NIRTH, allora NON ti compila proprio, perché non esiste quella costante!

    Quindi, USA i nomi di costanti già definite ... NON usare costanti String letterali in questi casi. E' un "controllo" in più a-gratis che il compilatore ti fa.
    Ultima modifica di andbin; 16-01-2017 a 13:40
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Quote Originariamente inviata da andbin Visualizza il messaggio
    E cosa è (e serve) questa variabile i ? Perché è uno "stato" esterno alla gestione del actionPerformed ... quindi come viene (e da chi) gestito? La questione è lì ...
    La i serve a scorrere dentro l'array char alfabeto in modo da visualizzare l'elemento attuale per poi passare all'elemento successivo al prossimo premi bottone... è inizializzato all'inizio della classe ma poi viene gestito all'interno dell'actionPerformed. E' sbagliato? Nella pratica mi funziona come volevo...


    Tutti i componenti hanno setVisible(boolean)


    Il action command è una stringa ... ovviamente NON ha un setVisible !

    Tutti gli oggetti XyzEvent hanno:

    public Object getSource()

    Il source è fornito come Object ma se l'evento l'ha originato un JButton, quel source è il riferimento appunto a quel JButton. Quindi si può usare il source se il listener non deve sapere nulla di specifico.
    Non ho capito... come lo utilizzo al fine di togliere la visibilità al pulsante?

    getSource().setVisible(False) mi da errore

    Grazie per le risposte!

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Quote Originariamente inviata da andbin Visualizza il messaggio
    1) La ripetizione per 21 volte della impostazione dei pulsanti non va granché bene, si può (e deve) ridurre! Immagina come .... hai un array di lettere ...
    Questa parte l'ho risolta così:

    codice:
    for(char c = 'A'; c <= 'Z'; c++){
    			JButton button = new JButton("" +c);
    			button.setBackground(Color.LIGHT_GRAY);
    			button.addActionListener(this);
    			add(button);
    ma l'unico dubbio è che ora ogni button si chiama "button"... qualora volessi richiamarne o gestirne uno in particolare, come fare?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    La i serve a scorrere dentro l'array char alfabeto in modo da visualizzare l'elemento attuale per poi passare all'elemento successivo al prossimo premi bottone... è inizializzato all'inizio della classe ma poi viene gestito all'interno dell'actionPerformed. E' sbagliato?
    Non so dire ora se è sbagliato .... perché sinceramente non ho capito cosa vuoi fare con i pulsanti (e con una sequenza di click su di essi).


    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Non ho capito... come lo utilizzo al fine di togliere la visibilità al pulsante?

    getSource().setVisible(False) mi da errore
    Se tu SAI che il listener è registrato solo su dei JButton, il "source" potrà essere solamente uno di quei JButton. E quindi ha senso (ed è lecito) fare un cast a JButton ed aspettarsi che non ci siano problemi in tal senso.

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Questa parte l'ho risolta così:

    codice:
    for(char c = 'A'; c <= 'Z'; c++){
    			JButton button = new JButton("" +c);
    			button.setBackground(Color.LIGHT_GRAY);
    			button.addActionListener(this);
    			add(button);
    ma l'unico dubbio è che ora ogni button si chiama "button"... qualora volessi richiamarne o gestirne uno in particolare, come fare?
    Il punto è quello: PERCHÉ dovresti fare qualcosa di "particolare"? O generalizzi il tutto o .... devi chiarire cosa intendi per gestione particolare!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Non so dire ora se è sbagliato .... perché sinceramente non ho capito cosa vuoi fare con i pulsanti (e con una sequenza di click su di essi).
    scusami ma come posso essere più chiaro oltre averti postato il ltesto dell'esercizio e quel che pensavo di fare? :P la i serve per scorrere il contatore perché, per l'appunto, devo fare un cifrario che associa ad ogni lettera dell'array alfabeto una lettera data dal tasto che premo

    char[] alfabeto = "abcdefgefghilmnopqrstuvz";

    se io premo in sequenza i tasti QRTU, dovrà comparire:

    a --> Q
    b --> R
    c --> T
    d --> U

    mi son spiegato?

    Se tu SAI che il listener è registrato solo su dei JButton, il "source" potrà essere solamente uno di quei JButton. E quindi ha senso (ed è lecito) fare un cast a JButton ed aspettarsi che non ci siano problemi in tal senso.
    ho capito ma come lo faccio nel pratico? Sto imparando java quindi magari mi sfugge qualche comando ad hoc che lo faccia...
    al momento non ho trovato nessun modo per nascondere solo il bottone.
    Ho provato con:

    codice:
    public void actionPerformed(ActionEvent e){
    			if(i<22){
    			testo.setText(alfabeto[i] + "--> " + e.getActionCommand());
    			i++;
    			this.setVisible(false);
    			}
    ma nasconde tutta la finestra!

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    scusami ma come posso essere più chiaro oltre averti postato il ltesto dell'esercizio e quel che pensavo di fare?
    Sì sì, non ho avuto tempo di rileggere tutta la discussione.

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    la i serve per scorrere il contatore perché, per l'appunto, devo fare un cifrario che associa ad ogni lettera dell'array alfabeto una lettera data dal tasto che premo

    char[] alfabeto = "abcdefgefghilmnopqrstuvz";

    se io premo in sequenza i tasti QRTU, dovrà comparire:

    a --> Q
    b --> R
    c --> T
    d --> U
    Sì, ok, questo mi è chiaro, come concetto. Quello che non ho capito (dal codice che hai postato finora) è COME intendi mantenere questa mappatura in memoria in modo che poi successivamente possa essere applicata effettivamente per cifrare qualcosa.

    Scrivere qualcosa in un JTextArea va bene, naturalmente, ai fini dell'utente. Ma serve anche altro per mantenere poi questa mappatura.

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    ho capito ma come lo faccio nel pratico? Sto imparando java quindi magari mi sfugge qualche comando ad hoc che lo faccia...
    al momento non ho trovato nessun modo per nascondere solo il bottone.
    JButton pulsanteAzionato = (JButton) e.getSource();

    Il (JButton) è un "cast".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Perfetto! Grazie mille

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.