Repaint probleem bij een Thread

Status
Niet open voor verdere reacties.

surffindoggy

Gebruiker
Lid geworden
5 apr 2006
Berichten
9
Hallo iedereen,

ik heb hier de volgende code:

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class InPanel extends Panel
{ ReserveerActionListener reserveer;
TextField aantalWachtendenVeld;
Button reserveerKnop;
Label inLabel ;
Licht licht;

public InPanel(String nr, Tuin tuin)
{ Label kassaLabel = new Label("KASSA " + nr);
kassaLabel.setBounds(24,0,48,21);
add(kassaLabel);
aantalWachtendenVeld = new TextField();
aantalWachtendenVeld.setBounds(0,36,36,27);
add(aantalWachtendenVeld);
reserveerKnop = new Button();
reserveerKnop.setLabel("Reserveer");
reserveerKnop.setBounds(60,36,74,25);
reserveerKnop.addActionListener(reserveer = new ReserveerActionListener());
add(reserveerKnop);
inLabel = new Label("IN " + nr);
inLabel.setBounds(156,0,30,20);
add(inLabel);
licht = new Licht();
licht.setBounds(156,36,24,24);
add(licht);
}

class Licht extends Canvas
{ private Color kleur = Color.red;

public Licht()
{ setSize(24,24);
}

public void setGroen()
{ kleur = Color.green;
puls = true;
repaint();
}

public void setRood()
{ kleur = Color.red;
puls = false;
repaint();
}

public void groenPuls() //Zet licht gedurende 3s op groen.
{ setGroen();
try
{ Thread.currentThread().sleep(3000);
}
catch(InterruptedException e){}
setRood();
}

public void paint(Graphics g)
{ g.setColor(kleur);
g.fillOval(0,0,24,24);
}
}

class ReserveerActionListener extends Thread implements ActionListener
{ private Thread t = null;

public void actionPerformed(ActionEvent event)
{ if(event.getSource()== reserveerKnop)
{ if(Integer.parseInt(aantalWachtendenVeld.getText())<= Tuin.MAX_AANTAL_BEZOEKERS)
{ if(t == null)
{ t = new Thread(this);
t.run();
}
}
else
{ aantalWachtendenVeld.setText("Fout");
}
}
}

public void run()
{ licht.groenPuls();
}
}
}

Het probleem ligt bij de procedure groenPuls() (in de klasse Licht). Ik will dat er DIRECT ge-repaint word nadat setGroen() en setRood() (ook in de klasse Licht) geroepen wordt.
Maar er wordt PAS ge-repaint wanneer de Thread eindigt (de Thread wordt in de klasse ReserveerActionListener aangeroepen).

gevraagd:
Weet iemand hoe ik de paint methode (klasse Licht) kan aanroepen terwijl de Thread nog "levend" is?

oohhh ja... er is een voorwaarde (sorry dat ik zo lastig ben :( )
Ik will dat de Thread "slaapt" tijdens de groenPuls() methode, en NIET tijdens de run() (klasse ReserveerActionListener) methode.

Alvast bedankt en hopelijk is m'n probleemstelling duidelijk voor jullie. :D
 
Ik heb je code niet helemaal uitgeplozen, maar het valt me wel op dat je t.run() aanroept, ik denk om de thread te starten. Dit is als ik het me goed herinner niet de manier om een thread te starten, je moet de methode start() aanroepen. run() aanroepen voert de code in de run method in dezelfde thread uit (hetzelfde als iedere andere methode aanroepen). start() aantroepen zorgt dat de thread aangemaakt wordt en roept dan binnen die thread run() aan.
run() aanroepen heeft dus tot gevolg dat binnen de main thread die sleep() ook aangeroepen wordt en dus die repaint ook 3 sec op zich laat wachten.
 
Laatst bewerkt:
Ok, als ik jouw goed begrijp, moet ik de t.run() vervangen met t.start(). Ik heb dat al eerder gedaan, maar ik heb het weer geprobeert. Wat het deed is direct de paint methode aanroepen (class Licht) en verder niks meer, zelfs niet de run() methode, dus vanzelfsprekend doet hij helemaal niets. Wat kan ik nog meer veranderen?

N.B. Ik had ook een Implements Runnable gekoppeld aan de ReserveerActionListener klasse. Dat doet ook niets.
 
PHP:
/*
 * Main.java
 *
 * Created on 6 april 2006, 16:58
 */

package helpmij;

/**
 *
 * @author Boring
 */
public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new StopLicht().setVisible(true);
        // TODO code application logic here
    }
    
}

//******************************************************************************************

/*
 * StopLicht.java
 *
 * Created on 6 april 2006, 16:58
 */

package helpmij;

/**
 *
 * @author  Boring
 */
public class StopLicht extends javax.swing.JFrame {
    
    /** Creates new form StopLicht */
    public StopLicht() {
        initComponents();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("StopLicht");
        jPanel1.setBackground(new java.awt.Color(255, 0, 0));
        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        jButton1.setText("Groen");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        getContentPane().add(jButton1, java.awt.BorderLayout.NORTH);

        pack();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        Runnable r=new Runnable(){
            public void run(){
                jPanel1.setBackground(java.awt.Color.GREEN);
                try{
                    Thread.sleep(3000);
                }catch(InterruptedException ie){
                    ie.printStackTrace();
                }
                jPanel1.setBackground(java.awt.Color.RED);
            }
        };
        Thread t = new Thread(r);
        t.start();
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new StopLicht().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration
    
}

Dit doet vrij primitief wat jij probeert te doen denk ik. Het zijn 2 bestanden: Main.java en StopLicht.java. Al heeft StopLicht ook een static main(), maar dat doet mijn ide automatisch blijkbaar.
Het komt me voor dat je nog niet zo lang bezig bent met java gezien je manier van coden en je vragen, maar ga zo door! Runnable is een interface en dus 'implements' doet niets meer dan de methode run() verplicht stellen in die klasse. De klasse Thread is degene die de thread echt maakt en start() start de thread. De klasse Thread roept dus zelf run() aan als de thread echt gestart is. Veel leerboeken leren je klassen als Form enzo de Runnable interface toe te wijzen, maar je ziet vaker anonieme inner classes in de praktijk. Ditzelfde geldt voor de ActionListener interface. Ik weet niet welk ide jij gebruikt, maar jBuilder en NetBeans doen het iig op deze manier. Ik raadt je NetBeans aan, die is erg goed, compleet en ook nogal gratis..
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan