|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
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);
}
}
}
C'è qualche modo? |
|
|
|
|
|
#2 |
|
Senior Member
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 |
|
|
|
|
|
#3 |
|
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();
}
}
});
}
}
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 |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Riesci a produrre un piccolo esempio che si possa postare e provare?
__________________
In God we trust; all others bring data |
|
|
|
|
|
#5 |
|
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();
}
}
});
}
}
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
}
}
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);
}
}
|
|
|
|
|
|
#6 |
|
Senior Member
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;
}
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();
}
}
});
}
}
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 |
|
|
|
|
|
#7 |
|
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 uhm, mi pare strano... c'è qualcosa che ancora una volta mi sfugge
Ultima modifica di Sergei : 09-09-2012 alle 15:20. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Dove hai scritto: Codice:
if (clip != null)
{
System.out.println(clip);
ca.elenco.setText(clip);
clip = clip + "\n";
fos.write(clip.getBytes());
}
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());
}
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#9 |
|
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 |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
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' ciao
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#11 |
|
Senior Member
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) |
|
|
|
|
|
#12 | ||
|
Member
Iscritto dal: Oct 2001
Messaggi: 291
|
Quote:
Quote:
non so come mai non c'ho pensato subito
|
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:45.



















