Re: Graphics - how to show partial progress.
rossum wrote:
On Wed, 02 Jan 2008 10:23:08 -0800, Knute Johnson
<nospam@rabbitbrush.frazmtn.com> wrote:
I'm not sure why this has to be so complicated. One image should be
plenty.
I have two threads, one is creating the image in the background and
the other is displaying it in the Event Dispatch Thread. I want to
avoid any possibility of clashes between these two threads, hence I
need two copies of the image - one for each thread.
What can clash? The job of repaint() is to schedule a paint on the EDT.
repaint() can be called from any thread.
Also, I don't think I would change the size of my component in
the paintComponent().
No, normally I would put it in an onResize Event, but I just stuck it
there for my test program in order to simplify things.
Why can't you just call repaint() periodically in your drawing code?
I do, indirectly through the publish/process mechanism.
rossum
You are moving a lot more data around and keeping two copies of the same
image. Doesn't seem too efficient to me. See below for a simplified
example.
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
public class test2 extends JPanel implements Runnable {
final BufferedImage image;
final Graphics g;
public test2() {
image = new BufferedImage(400,300,BufferedImage.TYPE_INT_ARGB);
g = image.createGraphics();
setPreferredSize(new Dimension(400,300));
}
public void run() {
g.setColor(Color.WHITE);
g.fillRect(0,0,image.getWidth(),image.getHeight());
g.setColor(Color.BLUE);
for (int x=0; x<400; x++) {
for (int y=0; y<300; y++) {
g.drawLine(x,y,x,y);
try { Thread.sleep(1);
} catch (InterruptedException ie) { }
}
repaint();
}
}
public void draw() {
new Thread(this).start();
}
public void paintComponent(Graphics g) {
g.drawImage(image,0,0,null);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final test2 t2 = new test2();
f.add(t2,BorderLayout.CENTER);
JButton b = new JButton("Draw");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
t2.draw();
}
});
f.add(b,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
});
}
}
--
Knute Johnson
email s/nospam/knute/
--
Posted via NewsDemon.com - Premium Uncensored Newsgroup Service
------->>>>>>http://www.NewsDemon.com<<<<<<------
Unlimited Access, Anonymous Accounts, Uncensored Broadband Access