Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-09-2012, 21:53   #1
Sergei
Member
 
Iscritto dal: Oct 2001
Messaggi: 291
[JAVA] Impostare JTextArea da un'altra classe

Salve forum

sto praticamente impazzendo con la creazione di questo programmino inutile... ma ormai mi ha preso e finché non lo finisco sto male

Ho quasi sistemato tutto solo che ho un piccolo problema. In una classe devo fare in modo che modifichi il contenuto della JTextArea che è presente in un'altra classe. Ora, io ricordo che tempo fa chiesi già questa cosa risolvendo mi pare creando un oggetto nella classe con la JTextArea e poi passando questo oggetto al costruttore nella classe che mi deve modificare la Jtextarea. Il problema è che questa classe ha un Thread praticamente è più o meno così:
Codice:
public class CatturaThread implements Runnable {
	Boolean vero = true;
	String dati = "dati.txt";
	CatturaMetodi cm = new CatturaMetodi();
	CatturaAutomatica ca = new CatturaAutomatica();
	

	public void run() {
		try {
			FileOutputStream fos = new FileOutputStream(dati, true);
			while (vero != false) {
				String clip = cm.getClipboard();
				if (clip != null) {
					System.out.println(clip);
					ca.elenco.setText(clip);
					clip = clip + "\n";
					fos.write(clip.getBytes());
				}

				cm.setDelete();
				Thread.sleep(500);
			}
		} catch (Exception ecc) {
			System.out.println(ecc);
		}
	}
}
Si può passare l'oggetto come parametro nel metodo run? A dire la verità c'ho provato ma non funziona
C'è qualche modo?
Sergei è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2012, 07:36   #2
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Lo puoi passare nel costruttore.
Attenzione pero' che Swing non e' multithreaded....
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2012, 13:20   #3
Sergei
Member
 
Iscritto dal: Oct 2001
Messaggi: 291
ti ringrazio per la risposta

Ho provato ma non va lo stesso .

Codice:
public class CatturaAutomatica extends JFrame {

	private JPanel pannello;
	JScrollPane scrollBar;
	JButton btnAvvia;
	public JTextArea elenco;
	CatturaMetodi cm = new CatturaMetodi();
	Boolean vero = true;
	String versione = "0.1 beta";
	CatturaThread ct;
	CatturaAutomatica auto = this;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					CatturaAutomatica frame = new CatturaAutomatica();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public CatturaAutomatica() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 600, 445);
		pannello = new JPanel();
		pannello.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(pannello);
		pannello.setLayout(null);

		btnAvvia = new JButton("Avvia");
		btnAvvia.setBounds(236, 49, 117, 25);
		pannello.add(btnAvvia);

		scrollBar = new JScrollPane();
		scrollBar.setBounds(44, 118, 486, 277);
		pannello.add(scrollBar);

		elenco = new JTextArea();
		elenco.setEditable(false);
		elenco.setLineWrap(true);
		scrollBar.setViewportView(elenco);

		btnAvvia.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				if (e.getSource() == btnAvvia) {
					CatturaThread ct = new CatturaThread();
					Thread t = new Thread(ct);
					t.start();
					

				}
			}
		});

	}
}
Io ho creato CatturaAutomatica auto = this; che passo al costruttore, poi creo un oggetto di CatturaAutomatica (esempio ca) e do ca = auto; giusto?
Poi associo ca alla jtextarea e al metodo settext. Il problema è che quando passo al costruttore quella parte mi dice che devo implementare un metodo, lo implemento e mi ripiazza sotto run()

Forse è per questo che non va, boh
Sergei è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2012, 13:58   #4
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da Sergei Guarda i messaggi
ti ringrazio per la risposta

Ho provato ma non va lo stesso .
<CUT>
Riesci a produrre un piccolo esempio che si possa postare e provare?
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2012, 14:03   #5
Sergei
Member
 
Iscritto dal: Oct 2001
Messaggi: 291
Certo, anzi mi scuso per non averlo fatto direttamente

Classe main con interfaccia grafica:
Codice:
public class CatturaAutomatica extends JFrame {

	private JPanel pannello;
	JScrollPane scrollBar;
	JButton btnAvvia;
	public JTextArea elenco;
	CatturaMetodi cm = new CatturaMetodi();
	Boolean vero = true;
	String versione = "0.1 beta";
	CatturaThread ct;
	CatturaAutomatica auto = this;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					CatturaAutomatica frame = new CatturaAutomatica();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public CatturaAutomatica() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 600, 445);
		pannello = new JPanel();
		pannello.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(pannello);
		pannello.setLayout(null);

		btnAvvia = new JButton("Avvia");
		btnAvvia.setBounds(236, 49, 117, 25);
		pannello.add(btnAvvia);

		scrollBar = new JScrollPane();
		scrollBar.setBounds(44, 118, 486, 277);
		pannello.add(scrollBar);

		elenco = new JTextArea();
		elenco.setEditable(false);
		elenco.setLineWrap(true);
		scrollBar.setViewportView(elenco);

		btnAvvia.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				if (e.getSource() == btnAvvia) {
					CatturaThread ct = new CatturaThread();
					Thread t = new Thread(ct);
					t.start();
					

				}
			}
		});

	}
}
Classe che deve modificare la JTextArea
Codice:
public class CatturaThread implements Runnable {
	Boolean vero = true;
	String dati = "dati.txt";
	CatturaMetodi cm = new CatturaMetodi();
	CatturaAutomatica ca;
	
	

	public void run(CatturaAutomatica auto) {
		ca = auto;
		try {
			FileOutputStream fos = new FileOutputStream(dati, true);
			while (vero != false) {
				String clip = cm.getClipboard();
				if (clip != null) {
					System.out.println(clip);
					ca.elenco.setText(clip);
					clip = clip + "\n";
					fos.write(clip.getBytes());
				}

				cm.setDelete();
				Thread.sleep(500);
			}
		} catch (Exception ecc) {
			System.out.println(ecc);
		}
	}



	@Override
	public void run() {
		// TODO Auto-generated method stub
		
	}


}
Classe con i metodi vari
Codice:
public class CatturaMetodi {
	// If a string is on the system clipboard, this method returns it;
	// otherwise it returns null.
	public static String getClipboard() {
		Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard()
				.getContents(null);

		try {
			if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
				String text = (String) t
						.getTransferData(DataFlavor.stringFlavor);
				return text;

			}
		} catch (UnsupportedFlavorException e) {
		} catch (IOException e) {
		}
		return null;
	}

	// This method writes a string to the system clipboard.
	// otherwise it returns null.
	public static void setClipboard(String str) {
		StringSelection ss = new StringSelection(str);
		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
	}

	// Quando viene invocato questo metodo cancellera' il contenuto presente
	// nella clipboard
	public static void setDelete() {
		Toolkit.getDefaultToolkit().getSystemClipboard()
				.setContents(new Transferable() {
					public DataFlavor[] getTransferDataFlavors() {
						return new DataFlavor[0];
					}

					public boolean isDataFlavorSupported(DataFlavor flavor) {
						return false;
					}

					public Object getTransferData(DataFlavor flavor)
							throws UnsupportedFlavorException {
						throw new UnsupportedFlavorException(flavor);
					}
				}, null);
	}

}
Sergei è offline   Rispondi citando il messaggio o parte di esso
Old 08-09-2012, 22:06   #6
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Dear
scusa il ritardo, ma il padrone di casa mi ha cacciato fuori senza alcun preavviso poiche' qualcuno era interessato al mio appartamento, e ho dovuto trovarne un altro in tutta fretta.

Scusami anche per averti dato un suggerimento forse un po' troppo stringato: quando dicevo di passarlo nel costruttore, intendevo questo:

Codice:
public class CatturaThread implements Runnable
{
...
    public CatturaThread (CatturaAutomatica catturaAutomatica)
    {
        ca = catturaAutomatica;
    }
il metodo run() doveva restare senza costruttori, quindi il codice che hai scritto nel metodo run(CatturaAutomatica auto) non veniva mai eseguito.

Se ho interpretato bene il tuo pensiero, qui trovi il codice modificato:

Codice:
import java.io.*;

public class CatturaThread implements Runnable
{
    Boolean vero = true;
    String dati = "dati.txt";
    CatturaMetodi cm = new CatturaMetodi();
    CatturaAutomatica ca;

    public CatturaThread (CatturaAutomatica catturaAutomatica)
    {
        ca = catturaAutomatica;
    }

    @Override
    public void run()
    {
        try
        {
            FileOutputStream fos = new FileOutputStream(dati, true);
            while (vero != false)
            {
                String clip = cm.getClipboard();
                if (clip != null)
                {
                    System.out.println(clip);
                    ca.elenco.setText(clip);
                    clip = clip + "\n";
                    fos.write(clip.getBytes());
                }

                cm.setDelete();
                Thread.sleep(500);
            }
        }
        catch (Exception ecc)
        {
            System.out.println(ecc);
        }
    }
}

import java.io.*;
import java.awt.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;

public class CatturaMetodi
{
    // If a string is on the system clipboard, this method returns it;
    // otherwise it returns null.
    public static String getClipboard()
    {
        Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);

        try
        {
            if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor))
            {
                String text = (String) t.getTransferData(DataFlavor.stringFlavor);
                return text;
            }
        }
        catch (UnsupportedFlavorException e)
        {
        }
        catch (IOException e)
        {
        }
        return null;
    }

    // This method writes a string to the system clipboard.
    // otherwise it returns null.
    public static void setClipboard(String str)
    {
        StringSelection ss = new StringSelection(str);
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
    }

    // Quando viene invocato questo metodo cancellera' il contenuto presente
    // nella clipboard
    public static void setDelete()
    {
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new Transferable()
        {
                public DataFlavor[] getTransferDataFlavors()
                {
                    return new DataFlavor[0];
                }

                public boolean isDataFlavorSupported(DataFlavor flavor)
                {
                    return false;
                }

                public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException
                {
                    throw new UnsupportedFlavorException(flavor);
                }
        }, null);
    }
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;

public class CatturaAutomatica extends JFrame
{

    private JPanel pannello;
    JScrollPane scrollBar;
    JButton btnAvvia;
    public JTextArea elenco;
    CatturaMetodi cm = new CatturaMetodi();
    Boolean vero = true;
    String versione = "0.1 beta";
    CatturaThread ct;
    CatturaAutomatica auto = this;

    /**
     * Launch the application.
     */
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    CatturaAutomatica frame = new CatturaAutomatica();
                    frame.setVisible(true);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public CatturaAutomatica()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 600, 445);
        pannello = new JPanel();
        pannello.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(pannello);
        pannello.setLayout(null);

        btnAvvia = new JButton("Avvia");
        btnAvvia.setBounds(236, 49, 117, 25);
        pannello.add(btnAvvia);

        scrollBar = new JScrollPane();
        scrollBar.setBounds(44, 118, 486, 277);
        pannello.add(scrollBar);

        elenco = new JTextArea();
        elenco.setEditable(false);
        elenco.setLineWrap(true);
        scrollBar.setViewportView(elenco);

        final CatturaAutomatica  myself = this;
        btnAvvia.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {

                if (e.getSource() == btnAvvia)
                {
                    CatturaThread ct = new CatturaThread(myself);
                    Thread t = new Thread(ct);
                    t.start();
                }
            }
        });
    }
}
Questo codice ha l'effetto di mostrare nella text area il testo che e' stato copiato nella clipboard di sistema.


Gli import li ho aggiunti grossolanamente a mano, ma il tuo ambiente sapra' far di meglio.

Spero di esserti stato d'aiuto
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 09-09-2012, 15:18   #7
Sergei
Member
 
Iscritto dal: Oct 2001
Messaggi: 291
Ti ringrazio per la risposta

Sono proprio rinco, avrei dovuto pensarci prima, avevo fatto proprio così con un altro programma, solo che la concentrazione ogni tanto va a farsi friggere e avevo scambiato il metodo run() per il costruttore

Funziona! Grazie mille!

L'unico problema è copia il testo nella jtextarea ma poi il testo dopo anziché andare a capo va a sostituirsi a quello già esistente, non ho capito bene il perché di questo nonostante abbia provato con ca.elenco.setText(clip + "\n"); e setWrapStyleWord(true);
uhm, mi pare strano... c'è qualcosa che ancora una volta mi sfugge

Ultima modifica di Sergei : 09-09-2012 alle 15:20.
Sergei è offline   Rispondi citando il messaggio o parte di esso
Old 10-09-2012, 06:32   #8
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da Sergei Guarda i messaggi
Ti ringrazio per la risposta

Sono proprio rinco, avrei dovuto pensarci prima, avevo fatto proprio così con un altro programma, solo che la concentrazione ogni tanto va a farsi friggere e avevo scambiato il metodo run() per il costruttore

Funziona! Grazie mille!

L'unico problema è copia il testo nella jtextarea ma poi il testo dopo anziché andare a capo va a sostituirsi a quello già esistente, non ho capito bene il perché di questo nonostante abbia provato con ca.elenco.setText(clip + "\n"); e setWrapStyleWord(true);
uhm, mi pare strano... c'è qualcosa che ancora una volta mi sfugge
Ti basta aggiungere una linea nella CatturaThread.run():

Dove hai scritto:
Codice:
                if (clip != null)
                {
                    System.out.println(clip);
                    ca.elenco.setText(clip);
                    clip = clip + "\n";
                    fos.write(clip.getBytes());
                }
Potresti farlo diventare:
Codice:
                if (clip != null)
                {
                    System.out.println(clip);
                    String text = ca.elenco.getText() + "\n" + clip;
                    ca.elenco.setText(text);
                    clip = clip + "\n";
                    fos.write(clip.getBytes());
                }
Ti consiglio di aggiungere un controllo sulla dimensione del testo (il testo continua a crescere e se il programma gira per tanto tempo, le dimensioni potrebbero essere inaccettabili e rallentare l'esecuzione, o peggio ancora produrre un OutOfMemory).
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 11-09-2012, 14:24   #9
Sergei
Member
 
Iscritto dal: Oct 2001
Messaggi: 291
perfetto, funziona!

Senti, una curiosità proprio a livello di logica, perché prima non funzionava?
Cioè scrivere ca.elenco.setText(clip + "\n"); non è equivalente a quello che mi hai consigliato perché chiaramente non funziona, solo che non riesco a capire il perché? Perché mancava il metodo getText()?

Grazie mille e scusa le domande
Sergei è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2012, 08:50   #10
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da Sergei Guarda i messaggi
perfetto, funziona!

Senti, una curiosità proprio a livello di logica, perché prima non funzionava?
Cioè scrivere ca.elenco.setText(clip + "\n"); non è equivalente a quello che mi hai consigliato perché chiaramente non funziona, solo che non riesco a capire il perché? Perché mancava il metodo getText()?

Grazie mille e scusa le domande
Ti chiedo scusa un'altra volta per il ritardo.
Quello che ho scritto e':
1 - leggi il testo attualmente visualizzato nella text area;
2 - aggiungi il nuovo testo al testo precedente;
3 - visualizza il risultato con la setText();

quello che avevi scritto prima semplicemente visualizzava il contenuto corrente della clipboard (i.e. non sommava il contenuto attuale con quello precedente). Detto fra noi, mi piace anche di piu' ma si tratta di un parere personale.

ciao
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2012, 13:03   #11
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Aggiungo che per appendere del testo a una JTextArea si può usare il metodo specifico "append"
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 14-09-2012, 20:18   #12
Sergei
Member
 
Iscritto dal: Oct 2001
Messaggi: 291
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Ti chiedo scusa un'altra volta per il ritardo.
Quello che ho scritto e':
1 - leggi il testo attualmente visualizzato nella text area;
2 - aggiungi il nuovo testo al testo precedente;
3 - visualizza il risultato con la setText();

quello che avevi scritto prima semplicemente visualizzava il contenuto corrente della clipboard (i.e. non sommava il contenuto attuale con quello precedente). Detto fra noi, mi piace anche di piu' ma si tratta di un parere personale.

ciao
afferrato

Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Aggiungo che per appendere del testo a una JTextArea si può usare il metodo specifico "append"
non so come mai non c'ho pensato subito
Sergei è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
3 smartphone ai prezzi più bassi ...
Pwn2Own Automotive 2026 da record: 76 ze...
Più watt, più bassi e subwoofer incluso:...
Xiaomi POCO F8 Pro, un top di gamma a 54...
Tassa di 2 euro sui piccoli pacchi: un a...
Robot super automatico con lavaggio a 75...
Ecco perché dovremmo tutti avere ...
È un robot completo con molte del...
ASUS indaga sui guasti dei Ryzen 7 9800X...
Addio limiti di packaging? Intel mostra ...
Disastro Williams: la FW48 non supera l'...
Un hotel italiano fa incetta di recensio...
OnePlus Nord 5 in super offerta su Amazo...
L'innovazione in tournée: arrivan...
Addio al caos dei gruppi Whatsapp: arriv...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:45.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v