Re: Graphics help please
 
Rexx Magnus wrote:
On Sun, 27 Jan 2008 18:38:24 -0000, Knute Johnson 
<nospam@rabbitbrush.frazmtn.com> wrote:
 The JPanel is buffered so that it doesn't actually clear the screen 
just the offscreen buffer.  You can't draw a circle pixel by pixel 
with the technique you used.  It will produce gaps because it only 
draws a pixel and every degree of angle and not the points in between.
 It would be easy to modify the code I provided to draw on an image 
instead of the JPanel.  You still must do any delaying outside of the 
paintComponent() method or you will block the Event Dispatch Thread 
and none of the rest of your GUI will respond and it probably won't 
show anything until it is finished.
 So since you haven't told us exactly what you are going to display in 
this slow drawing it is still my opinion that it is better to draw it 
in paintComponent() unless there is some compelling reason not to.
I'm trying to write a basic engine that I can use for all sorts of 
purposes, one of them being for rendering fractals, but it needs to be 
visible as it's being drawn so you can abort if it ends up being slow 
besides other things - and also so that I can plot graphs and render 
fields to show various effects such as gravity.
I'm not bothered about lines being discontinuous - I'm just trying to 
replicate some old experimental programming, similar to what I used to 
do in BASIC. It's just annoying that there has to be so much set-up just 
to do something that is quite simple in a lot of other languages.
A lot of the stuff I write doesn't actually have a definite end, so it's 
just a case of watching it draw and stopping it when you're satisfied.
OK.  Well then I would definitely use an offscreen buffer and draw it to 
the onscreen component on some sort of regular schedule.  You can put a 
repaint() call in your drawing thread or use another thread or a timer.
This example puts a 1ms delay between drawing elements and draws the 
offscreen image to the onscreen every 200ms.  Depending on how much 
processing it takes to produce your pixels, you might not need the 
drawing delay.
Sometimes it really is better to provide a little more information up 
front about what you are actually trying to do so as to get a better 
answer here.
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;
import javax.swing.*;
public class test2 extends JPanel implements ActionListener, Runnable {
     private final BufferedImage bi;
     private final Random random;
     private final javax.swing.Timer timer;
     public test2() {
         bi = new BufferedImage(300,300,BufferedImage.TYPE_INT_ARGB);
         random = new Random(new Date().getTime());
         timer = new javax.swing.Timer(200,this);
         setPreferredSize(new Dimension(bi.getWidth(),bi.getHeight()));
     }
     public void run() {
         timer.start();
         while (true) {
             int x = random.nextInt(bi.getWidth());
             int y = random.nextInt(bi.getHeight());
             bi.setRGB(x,y,255<<24|255);
             try {
                 Thread.sleep(1);
             } catch (InterruptedException ie) {
                 ie.printStackTrace();
             }
         }
     }
     public void actionPerformed(ActionEvent ae) {
         repaint();
     }
     public void paintComponent(Graphics g) {
         g.drawImage(bi,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);
                 test2 t2 = new test2();
                 f.add(t2);
                 f.pack();
                 f.setVisible(true);
                 new Thread(t2).start();
             }
         });
     }
}
-- 
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