Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
HONOR Magic V6 è arrivato in Italia a 2.299,90 euro con una promessa precisa: unire 4 mm di spessore da aperto (8,75 mm chiuso nel modello White, 9 mm negli altri colori) a una batteria da 6.660 mAh, la più capiente mai vista su un pieghevole. Lo abbiamo usato per oltre una settimana in versione Red 16/512 GB per capire se lo Snapdragon 8 Elite Gen 5 tiene testa alla concorrenza anche fuori dai benchmark ufficiali
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-09-2012, 20: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, 06: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, 12: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, 12: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, 13: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, 21: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, 14: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 14:20.
Sergei è offline   Rispondi citando il messaggio o parte di esso
Old 10-09-2012, 05: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, 13: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, 07: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, 12: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, 19: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


Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Samsung potrebbe abbandonare la serie Fl...
Xiaomi Pad 8 Pro e Xiaomi Pad 8 vanno in...
Il chip di iPhone 18 Pro rinuncia alle m...
La serie Galaxy S26 sta andando molto be...
Il prossimo mid-range di Xiaomi avr&agra...
Apple Watch SE 3 scende a 229€: prezzo i...
Xbox Game Pass doveva essere totalmente ...
Cloudflare passa dall'altra parte: aiuta...
Samsung The Freestyle scende a 349€ (-20...
Il Parlamento Europeo approva il regolam...
Francia, l'indagine antitrust su NVIDIA ...
Beatbot e il Carnevale Estivo delle Pisc...
Roborock Qrevo Curv 2 Flow a 549,99€: il...
Huawei porta in Italia il nuovo MatePad ...
Poche porte USB (e non solo) sul portati...
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: 09:20.


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