PDA

Visualizza la versione completa : (java) Come si usa il metodo wait


abcd1000
04-09-2003, 15:02
Ho un JTextPane inserito in un JFrame
Il JFrame è dotato di un menu
Quando permo su un pulsante del menu vorrei che il sistema rispondesse con qualche istante di ritardo, quindi nella action dei pulsanti ho messo la seguente istruzione:

try {
editor.wait(100);
} catch (InterruptedException ie) {
System.out.println(ie.toString());
}

Purtroppo viene generata la seguente eccezione quando premo su un pulsante (che riguarda proprio la riga editor.wait)
Qualcuno sa aiutarmi a risolvere questa eccezione o mi sa suggerire un metodo alternativo alla wait?

java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.wait(Native Method)
at classes.main.Editor$NewAction.actionPerformed(Edit or.java:878)
at javax.swing.AbstractButton.fireActionPerformed(Unk nown Source)
at javax.swing.AbstractButton$ForwardActionEvents.act ionPerformed(Unknow
n Source)
at javax.swing.DefaultButtonModel.fireActionPerformed (Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(Unknown Sour
ce)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent( Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(U nknown Source)

kuarl
04-09-2003, 15:08
metti Thread.sleep(1000);

il programma si addormenterà per un secondo

o se vuoi addormentare solo l'editor puoi usare

editor.sleep() ma non ne sono sicuro, conosco poko questi metodi :fagiano:

abcd1000
04-09-2003, 15:42
editor.sleep non esiste

ho usato
Thread.sleep(1000);

c'è un problema
Io voglio fare questa sequenza di istruzioni all'interno della action di un pulsante

metodo1
sleep
metodo2

però avendo messo lo sleep dentro l'azione di un pulsante java fa questo:

quando premo il pulsante l'effetto è questo:

esegue il metodo sleep
poi il metodo 1
poi il metodo 2

Come faccio ad eseguire questa sequenza?:

metodo1
sleep
metodo2

abcd1000
04-09-2003, 19:40
help

javamen
04-09-2003, 23:48
Ciao abcd1000

wait() é un metodo che va associato a notify() e per implementarli occorre una gestione particolare.

siccome ogni applicazione di per se é un thread, potresti o estendere la classe Thread , ma credo che tu abbia già esteso JFrame , oppure implementare l'interfaccia Runnable.

Guarda ti faccio un regalino :ciauz:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Ritardo extends JFrame implements ActionListener, Runnable{

JTextField fl1 = new JTextField();
JTextArea ar1 = new JTextArea();
JButton bt1 = new JButton("ESEGUI");
Thread t;
public Ritardo(){
super("FRAME GENERICO");
fl1.setSize(80,20); fl1.setLocation(10,10);
ar1.setSize(400,200); ar1.setLocation(120,20);
bt1.setSize(80,20); bt1.setLocation(10,50);
JPanel pn = new JPanel();
pn.add(fl1); pn.add(ar1); pn.add(bt1);
setContentPane(pn);
bt1.addActionListener(this);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) { System.exit(0); }
});
Container c = getContentPane();
c.setLayout(null);
setSize(600,400);
show();

}

public void run() // ridefinisco run di Runnable
{
try{
ar1.append("ciao" + "\n");
t.sleep(2000);
ar1.append("abcd1000");
}
catch(InterruptedException i)
{
i.getMessage();
}

}

//-------------------GESTIONE EVENTO BOTTONE -----------------------------
public void actionPerformed(ActionEvent e)
{
Object o = e.getSource();
if (o == bt1){
avviaThread();
}
}

public void avviaThread()
{
t = new Thread(this);
t.start(); // questo richiama il metodo run()
}
public static void main (String arg []){
Ritardo f = new Ritardo();
}
}// fine frame

abcd1000
05-09-2003, 01:15
grazie delle righe di codice però per implementare una pausa di 1 secondo dentro l'action di un pulsante mi sembra una soluzione un pò troppo corposa

non ci sarà un altro soluzione?

javamen
05-09-2003, 10:10
In java i thread si gestiscono o con la classe Thread o con l'interfaccia Runnable.

abcd1000
05-09-2003, 10:15
ma non posso semplicemente scrivere

Threa.sleep(1000);


senza bisogno di implementare l'interfaccia Runnable visto che il mio applicativo è già un Thread?

Zero-2
05-09-2003, 11:16
Se vuoi far addormentare il thread o qualsiasi classe per un secondo si :)

abcd1000
05-09-2003, 12:22
IL PROBLEMA è che sono dentro l'action di un bottone

se scrivo

azione1
Thread.sleep
azione2


la jvm mi esegue

Threa,sleep
azione1
azione2

come faccio a dirgli di eseguire le istruzioni nell'ordine con cui sono scritte?

Loading