Results 1 to 4 of 4
  1. #1
    rjevans2000 is offline Member
    Join Date
    Aug 2007
    Posts
    3
    Rep Power
    0

    Default Repaint fails when using threads

    Hi, I'm trying to get to grips with threads and am creating a test application that carries out several tasks simultaneously. My problem is that when using a thread, the repaint() method doesn't seem to update the panel that I would expect it to. Below is the fragment of code in question:

    class ColourPanel extends JPanel implements Runnable {

    public void run() {
    try {
    for (int i=0;i<100000;i++) {

    randomNumber = Math.random();
    if ((randomNumber >= 0) && (randomNumber < 0.25))
    setBackground(Color.RED);
    if ((randomNumber >= 0.25) && (randomNumber < 0.5))
    setBackground(Color.BLUE);
    if ((randomNumber >= 0.5) && (randomNumber < 0.75))
    setBackground(Color.MAGENTA);
    if ((randomNumber >= 0.75) && (randomNumber <= 1))
    setBackground(Color.ORANGE);

    repaint();
    setVisible(true);
    Thread.sleep(200);
    }
    }
    catch (InterruptedException e) {
    }
    }

    public ColourPanel() {

    setLayout(new BorderLayout());

    colourButton = new JButton("Change Background");
    add(colourButton, BorderLayout.SOUTH);

    colourButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {

    Runnable q = new ColourPanel();
    Thread s = new Thread(q);
    s.start();

    }
    });
    }

    private JButton colourButton;
    private double randomNumber;

    }

    I would expect the repaint() method to update the panel with the new background colour. However, this does not work and I can't see why. I have tried calling getParent().repaint() and getRootPane().repaint() but these also don't work. Am I barking up the wrong tree? Any help would be greatly appreciated!

  2. #2
    Bojevnik is offline Member
    Join Date
    Aug 2007
    Posts
    13
    Rep Power
    0

    Default

    instead of
    Runnable q = new ColourPanel();
    Thread s = new Thread(q);

    try
    Thread s = new Thread(this);

    (im not 100&#37; on this).
    I HATE SMURFS!!!!!

  3. #3
    rjevans2000 is offline Member
    Join Date
    Aug 2007
    Posts
    3
    Rep Power
    0

    Default

    Thread s = new Thread(this) fails to compile with the following error message:

    symbol : constructor Thread(<anonymous java.awt.event.ActionListener>)
    location: class java.lang.Thread
    Thread s = new Thread(this);

    Any ideas?

  4. #4
    hardwired's Avatar
    hardwired is offline Senior Member
    Join Date
    Jul 2007
    Posts
    1,576
    Rep Power
    8

    Default

    Java Code:
    Runnable q = new ColourPanelRx();
    Thread s = new Thread(q);
    s.start();
    This is okay to do but it creates and starts up a new instance, not this enclosing class, but another that doesn't do anything because it isn't shown in a gui. To do this with the enclosing class you can build some state (member variables: thread and animate) and some methods to make things happen (start and stop).
    To check this idea out, ie, "a new instance not getting shown", you could see what happens with this:
    Java Code:
    Runnable q = new ColourPanelRx();
    Thread s = new Thread(q);
    s.start();
    // JPanel default size is 10,10.
    ((JComponent)q).setPreferredSize(new Dimension(100,100));
    JOptionPane.showMessageDialog(null, q, "separate instance", -1);
    Java Code:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class ColourPanelRx extends JPanel implements Runnable {
        Thread thread;
        boolean animate = false;
    
        public void run() {
            try {
                for (int i=0;i<100000;i++) {
                    randomNumber = Math.random();
                    if ((randomNumber >= 0) && (randomNumber < 0.25))
                        setBackground(Color.RED);
                    if ((randomNumber >= 0.25) && (randomNumber < 0.5))
                        setBackground(Color.BLUE);
                    if ((randomNumber >= 0.5) && (randomNumber < 0.75))
                        setBackground(Color.MAGENTA);
                    if ((randomNumber >= 0.75) && (randomNumber <= 1))
                        setBackground(Color.ORANGE);
                    repaint();
    //                setVisible(true);
                    Thread.sleep(1000);
                    if(!animate) break;
                }
            } catch (InterruptedException e) {
                stop();
            }
        }
    
        private void start() {
            if(!animate) {
                animate = true;
                thread = new Thread(this);
                thread.setPriority(Thread.NORM_PRIORITY);
                thread.start();
            }
        }
    
        private void stop() {
            animate = false;
            if(thread != null)
                thread.interrupt();
            thread = null;
        }
    
        public ColourPanelRx() {
            setLayout(new BorderLayout());
    
            colourButton = new JButton("Change Background");
            add(colourButton, BorderLayout.SOUTH);
    
            colourButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    System.out.printf("this = %s%nthis.enclosingClass = %s%n",
                                       this.getClass().getName(),
                                       this.getClass().getEnclosingClass().getName());
    //                Runnable q = new ColourPanelRx();
    //                Thread s = new Thread(q);
    //                s.start();
                    start();
                }
            });
        }
    
        private JButton colourButton;
        private double randomNumber;
    
        public static void main(String[] args) {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.getContentPane().add(new ColourPanelRx());
            f.setSize(400,400);
            f.setLocation(200,200);
            f.setVisible(true);
        }
    }

Similar Threads

  1. Problem in repaint
    By Preethi in forum AWT / Swing
    Replies: 16
    Last Post: 03-18-2008, 08:10 PM
  2. Repaint problem
    By swimberl in forum Java 2D
    Replies: 1
    Last Post: 02-16-2008, 09:12 PM
  3. Repaint problem
    By swimberl in forum Java 2D
    Replies: 0
    Last Post: 01-06-2008, 03:28 AM
  4. repaint validate doLayout
    By Gajesh Tripathi in forum AWT / Swing
    Replies: 1
    Last Post: 10-27-2007, 06:53 PM
  5. Repaint fails when using threads
    By rjevans2000 in forum Threads and Synchronization
    Replies: 1
    Last Post: 09-21-2007, 11:22 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •