DOMANDA [JAVA] Collegare evento pulsante in un'altra finestra

Sergei

Utente Attivo
115
1
Chissà se ho scritto bene il titolo... uhm...

Vediamo se riesco a spiegarmi in italiano :vv:

Stavo giocando con la GUI in Java e volevo fare una cosa apparentemente semplice.
Ho due finestre: FinestraUno e FinestraDue
Nella finestrauno ho una JTextArea che chiameremo ta perché sono pigro e più di due parole non ho voglia di scrivere :asd:
poi ho un pulsante che apre la seconda finestra.
Nella finestradue ho un semplice pulsante che deve stampare nella JTextArea della finestrauno "Ciao Mondo!"
Allora ho pensato di creare nella finestradue un oggetto di finestrauno (FinestraUno editor), creo l'actionlistener bla bla bla
if (e.getSource() == saluto){
editor.ta.setText("Ciao Mondo!");

E chiaramente non va. Ora, essendo io IGNORANTISSIMO in materia, mi potresti spiegare senza sfondarmi a mazzate il cranio perché sono così stolto da non far comparire il messaggio? C'è qualcosa che mi sfugge...
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
Fammi capire bene: hai una finestra con un bottone e vuoi che cliccandolo compaia la seconda finestra con la frase ciao mondo?
Oppure le due finestre sono già tutte e aperte e vuoi solamente che nella seconda compaia il testo in seguito alla pressione del bottone contenuto nell'altra?
 

Sergei

Utente Attivo
115
1
la seconda che hai detto :)
quelo.jpg

Nella finestra 1 ho la jtextarea e nella finestra 2 ho il bottone, cliccando sul bottone della finestra 2 mi devo comparire Ciao Mondo nella textarea della finestra 1
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
1) nel main istanzi la finestra 1
2) sempre nel main istanzi la finestra 2 e gli passi (vedi tu come fare) l'oggetto della finestra 1
3)Al bottone della finestra 2 colleghi un addEventListener e al suo interno ci metti oggettoFinestra1.ta.setText("Ciao mondo!").
Ovviamente la variabile ta deve essere pubblica!
 

Sergei

Utente Attivo
115
1
ah, perdonami, mi sono dimenticato di dirti che praticamente io apro la finestra1 e dentro c'è un pulsante apri che apre la finestra2.
per addEventListener intendi addActionListener?

Comunque avevo fatto come hai detto, almeno credo, con la variabile ta public ma niente :(. Cioè... aspè, vediamo un attimo, io ho fatto così alle fine:

ClasseA:
Codice:
import java.awt.BorderLayout;
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 ClasseA extends JFrame implements ActionListener {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    JPanel pannello;
    public JTextArea ta;
    JButton apri;

    public ClasseA() {
        super("Finestra Uno");
        setSize(600, 350);
        setBounds(100, 100, 450, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // creiamo un pannello per poterci scrivere sopra
        pannello = new JPanel();

        // creiamo un casella di testo
        ta = new JTextArea();
        ta.setLineWrap(false); // manda a capo automaticamente il testo se TRUE!

        // creo il pulsante sci
        apri = new JButton("Apri");

        // Aggiungiamo l'area di testo al pannello
        pannello.add(ta);
        
        // Aggiungiamo il pulsante apri
        pannello.add(apri);
        
        // aggiungiamo il pannello a JFrame
        add(pannello, BorderLayout.NORTH);
        
        // azioniamo apri
        apri.addActionListener(this);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == apri){
            new ClasseB();
        }
        
    }

}

ClasseB:
Codice:
import java.awt.BorderLayout;
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 ClasseB extends JFrame implements ActionListener{
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    JPanel pannello2;
    JButton saluto;
    ClasseA testo;

    public ClasseB() {
        super("Finestra Due");
        setSize(600, 350);
        setBounds(300, 250, 450, 300);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setVisible(true);
        
        // creiamo un pannello per poterci scrivere sopra
        pannello2 = new JPanel();

        

        // creo il pulsante sci
        saluto = new JButton("Saluta");

                
        // Aggiungiamo il pulsante apri
        pannello2.add(saluto);
        
        // aggiungiamo il pannello a JFrame
        add(pannello2, BorderLayout.CENTER);
        
        // azioniamo apri
        saluto.addActionListener(this);
        
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == saluto){
            testo = new ClasseA();
            testo.ta.setText("Ciao Mondo!");
            
        }
        
    }

}

Main:
Codice:
public class EseguiAB {
    public static void main(String[] args) {
        ClasseA ca = new ClasseA();
        ca.setVisible(true);

    }

}
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
per addEventListener intendi addActionListener?
Si si intendevo addActionListener.

Comunque ho risolto, tu nella classe B non devi istanziare una nuova classe A ma devi mordificare l'oggetto classe A già esistente. La soluzione è, come ti avevo detto, passare alla classe B l'oggetto classe A.
Classe A:
Codice:
import java.awt.BorderLayout;
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 ClasseA extends JFrame implements ActionListener {
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    JPanel pannello;
    public JTextArea ta;
    JButton apri;
    [COLOR=#008000][B]ClasseA ClasseA = this;[/B][/COLOR]


    public ClasseA() {
        super("Finestra Uno");
        setSize(600, 350);
        setBounds(100, 100, 450, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);


        // creiamo un pannello per poterci scrivere sopra
        pannello = new JPanel();


        // creiamo un casella di testo
        ta = new JTextArea();
        ta.setLineWrap(false); // manda a capo automaticamente il testo se TRUE!


        // creo il pulsante sci
        apri = new JButton("Apri");


        // Aggiungiamo l'area di testo al pannello
        pannello.add(ta);


        // Aggiungiamo il pulsante apri
        pannello.add(apri);


        // aggiungiamo il pannello a JFrame
        add(pannello, BorderLayout.NORTH);


        // azioniamo apri
        apri.addActionListener(this);


    }


    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == apri){
            new ClasseB([COLOR=#008000][B]ClasseA[/B][/COLOR]);
        }


    }


}
Classe B:
Codice:
import java.awt.BorderLayout;
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 ClasseB extends JFrame implements ActionListener{


    /**
     *
     */
    private static final long serialVersionUID = 1L;
    JPanel pannello2;
    JButton saluto;
    ClasseA testo;


    public ClasseB([COLOR=#008000][B]ClasseA ClasseA[/B][/COLOR]) {
        super("Finestra Due");
       [COLOR=#008000] [B]testo = ClasseA;[/B][/COLOR]
        setSize(600, 350);
        setBounds(300, 250, 450, 300);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setVisible(true);


        // creiamo un pannello per poterci scrivere sopra
        pannello2 = new JPanel();






        // creo il pulsante sci
        saluto = new JButton("Saluta");




        // Aggiungiamo il pulsante apri
        pannello2.add(saluto);


        // aggiungiamo il pannello a JFrame
        add(pannello2, BorderLayout.CENTER);


        // azioniamo apri
        saluto.addActionListener(this);


    }


    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == saluto){
            testo.ta.setText("Ciao Mondo!");


        }


    }


}
 

Sergei

Utente Attivo
115
1
Funge, grazie :)

Però mi puoi aiutare a capire come funziona? Perché questo fatto mi è nuovo :(
Io creo nella classea un suo oggetto che ha come reference this, perché giustamente fa riferimento a se stesso. Questo oggetto lo passo come parametro nella classeb. E qual è la differenza tra creare direttamente un oggetto nella classeb con uhm... ClasseA testo = new ClasseA()?
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
Tu non devi creare un nuovo oggetto classe A ma devi modificare il parametro dell'oggetto classe A già creato..:sisi:
 

cawletto

Utente Attivo
475
25
CPU
i5 750
HDD
1 TB
RAM
6 GB
GPU
GXT 460 SE 1GB overclocked
Monitor
Samsung LCD 1280x1024
PSU
Cooler Master Silent Pro M 600 W
Case
HP
OS
Windows 7-64 bit
Figurati :asd:
 

Sergei

Utente Attivo
115
1
chiedo scusa se riuppo questo topic ma vorrei evitare di aprirne un altro per un problema simile.
Stavo creando la funzione cerca del mio editor... allora devo aprire questa nuova finestra con dentro la funzione cerca. Segui le istruzioni come detto qui. Tutto bene. Ottengo la textarea e bla bla bla. Vado a provare e mi dà java.lang.NullPointerException che fa riferimento a questa parte:
String prendiTesto = trovaParola.ta.getText(); dove ta è la textArea di un'altra classe.
Questo è il codice che ho utilizzato:
Codice:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;

public class toFind extends JFrame implements ActionListener {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JPanel panCerca, panDirezione;
    JLabel trovaLab;
    JTextArea find;
    JButton cerca, annulla;
    JRadioButton rbSu, rbGiu;
    JCheckBox mami;
    NotepadGUI trovaParola;
    int index;

    public toFind(NotepadGUI word) {
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 430, 154);
        panCerca = new JPanel();
        panCerca.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(panCerca);
        panCerca.setLayout(null);
        word = trovaParola;
        setVisible(true);

        trovaLab = new JLabel("Trova");
        trovaLab.setBounds(6, 16, 33, 14);
        panCerca.add(trovaLab);

        find = new JTextArea();
        find.setBounds(49, 11, 229, 19);
        panCerca.add(find);

        cerca = new JButton("Trova Successivo");
        cerca.setBounds(288, 12, 122, 23);
        panCerca.add(cerca);

        annulla = new JButton("Annulla");
        annulla.setBounds(288, 41, 122, 23);
        panCerca.add(annulla);

        panDirezione = new JPanel();
        panDirezione.setBorder(new TitledBorder(null, "Direzione",
                TitledBorder.LEADING, TitledBorder.TOP, null, null));
        panDirezione.setBounds(170, 57, 108, 57);
        panCerca.add(panDirezione);

        rbSu = new JRadioButton("Su");
        panDirezione.add(rbSu);

        rbGiu = new JRadioButton("Gi\u00F9");
        panDirezione.add(rbGiu);

        mami = new JCheckBox("Maiuscole/minuscole");
        mami.setBounds(6, 79, 135, 23);
        panCerca.add(mami);
        
        
        cerca.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == cerca) {

            String prendiTesto = trovaParola.ta.getText();
            String cercaParola = find.getText();
            index = prendiTesto.indexOf(cercaParola,
                    index + cercaParola.length());

            if (index == -1) {
                System.out.println("Parola non trovata");
            } else if (index != -1) {
                trovaParola.ta.grabFocus(); // attiva l'evidenziazione
                trovaParola.ta.select(index, index + cercaParola.length()); // inizio e fine
                // dell'evidenziazione
                trovaParola.ta.setSelectedTextColor(Color.BLACK); // colore INTERNO della
                                                        // scritta evidenziata

                System.out.println("Index e': " + index);

            }

        }
        
    }
}

Boh, forse ormai non ci vedo più :asd:
 
U

Utente cancellato 68151

Ospite
Come hai dichiarato la JTextArea ta? se nel costruttore non hai messo alcun parametro, getText() ritorna null, quindi scatta l' eccezione.
prova con ta = new JTextArea(""); così per l' utente è comunque vuota, ma almeno nel programma non torna null
 

Sergei

Utente Attivo
115
1
aspè, facciamo un po' di chiarezza :D

Allora, io ho nella classe NotepadGUI questo:
Codice:
public class NotepadGUI extends JFrame implements ActionListener,
        UndoableEditListener {

    private static final long serialVersionUID = 1L;
    JPanel p1, p2;
    public JTextArea ta;
    JButton esci;
    JFileChooser test;
    File f1, f2;
    JPopupMenu popmenu;
    JMenuItem taglia, copia, incolla;
    JScrollPane scroll;
    UndoManager undo;
    NotepadGUI car = this;
    NotepadGUI word = this;
    

    public NotepadGUI() {
        super("JNotepad");
        //setSize(1200, 700);
        setBounds(100, 100, 760, 515); //x,y,larg,altezza
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // istanziamo il nostro menu prendendolo dalla classe Menu
        Menu menu = new Menu();
        setJMenuBar(menu);

        // creo il menu contestuale
        popmenu = new JPopupMenu();
        // creo le tre voci del menu contestuale
        taglia = new JMenuItem("Taglia");
        copia = new JMenuItem("Copia");
        incolla = new JMenuItem("Incolla");
        // aggiungo le tre voci al menu contestuale
        popmenu.add(taglia);
        popmenu.add(copia);
        popmenu.add(incolla);

        // attiviamo i componenti del menu contestuale
        taglia.addActionListener(this);
        copia.addActionListener(this);
        incolla.addActionListener(this);

        // ora dobbiamo creare un componente di MouseListener in modo tale che
        // si attivi il menu quando noi clicchiamo col tasto destro. Per farlo
        // dovremmo creare una classe che MouseAdapter cosi' da avere i suoi
        // metodi. Quindi creiamo un oggetto di MouseListener che pero' nasce
        // nella classe PopupListener(che creiamo noi). 

        // creiamo un pannello per poterci scrivere sopra
        p1 = new JPanel();

        // creiamo un casella di testo
        ta = new JTextArea("");
        ta.setLineWrap(false); // manda a capo automaticamente il testo se TRUE!
        ta.setFont(new Font("Lucida Console", Font.ROMAN_BASELINE, 12));

        // creo il pulsante sci
        esci = new JButton("Esci");

        // Aggiungiamo l'area di testo al pannello
        p1.add(ta);

        // creo la scrollbar
        scroll = new JScrollPane(ta); // prende come parametro la
                                        // area di testo perche'
                                        // ad essa va applicata

        // aggiungo la scrollbar al JFrame. Alcune considerazioni:
        // 1. prende due parametri: il layout, ossia dove va posizionata la
        // scrollbar, il secondo parametro e' l'oggetto scrollbar che abbiamo
        // istanziato prima col nome scroll;
        // 2. se usiamo la scrollbar non dovremmo inserire l'area di testo nel
        // pannello, bensi' va inserita la scrollbar col metodo qui sotto:
        getContentPane().add(BorderLayout.CENTER, scroll);

        // Facciamo in modo che JFrame veda il nostro pannello
        // add(ta);

        MouseListener popupListener = new PopupListener();
        ta.addMouseListener(popupListener); // collega l'area di testo con il
                                            // mouse e il menu
        // Creo l'undo manager
        undo = new UndoManager();
        // collego undo all'area di testo
        ta.getDocument().addUndoableEditListener(this);

    }
. . .

mentre la classe toFind è questa:
Codice:
public class toFind extends JFrame implements ActionListener {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JPanel panCerca, panDirezione;
    JLabel trovaLab;
    JTextArea find;
    JButton cerca, annulla;
    JRadioButton rbSu, rbGiu;
    JCheckBox mami;
    NotepadGUI trovaParola;
    int index;

    public toFind(NotepadGUI word) {
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 430, 154);
        panCerca = new JPanel();
        panCerca.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(panCerca);
        panCerca.setLayout(null);
        [SIZE=6][B]word = trovaParola;[/B][/SIZE]
        setVisible(true);

        trovaLab = new JLabel("Trova");
        trovaLab.setBounds(6, 16, 33, 14);
        panCerca.add(trovaLab);

        find = new JTextArea();
        find.setBounds(49, 11, 229, 19);
        panCerca.add(find);

        cerca = new JButton("Trova Successivo");
        cerca.setBounds(288, 12, 122, 23);
        panCerca.add(cerca);

        annulla = new JButton("Annulla");
        annulla.setBounds(288, 41, 122, 23);
        panCerca.add(annulla);

        panDirezione = new JPanel();
        panDirezione.setBorder(new TitledBorder(null, "Direzione",
                TitledBorder.LEADING, TitledBorder.TOP, null, null));
        panDirezione.setBounds(170, 57, 108, 57);
        panCerca.add(panDirezione);

        rbSu = new JRadioButton("Su");
        panDirezione.add(rbSu);

        rbGiu = new JRadioButton("Gi\u00F9");
        panDirezione.add(rbGiu);

        mami = new JCheckBox("Maiuscole/minuscole");
        mami.setBounds(6, 79, 135, 23);
        panCerca.add(mami);
        
        
        cerca.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == cerca) {

            String prendiTesto = trovaParola.ta.getText();
            String cercaParola = find.getText();
            index = prendiTesto.indexOf(cercaParola,
                    index + cercaParola.length());

            if (index == -1) {
                System.out.println("Parola non trovata");
            } else if (index != -1) {
                trovaParola.ta.grabFocus(); // attiva l'evidenziazione
                trovaParola.ta.select(index, index + cercaParola.length()); // inizio e fine
                // dell'evidenziazione
                trovaParola.ta.setSelectedTextColor(Color.BLACK); // colore INTERNO della
                                                        // scritta evidenziata

                System.out.println("Index e': " + index);

            }

        }
        
    }
}

Niente, non c'arrivo proprio a capire :( [RISOLTO!]

EDIT:
assurdo! faccio sempre quell'errore. Sono rinco, niente da fare. Ora mi spezzo un dito così la prossima volta mi ricordo di scriverlo al contrario. Niente da fare, sempre quell'errore faccio, non mi entra in testa che è al contrario
 
Ultima modifica:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!