Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!eternal-september.org!feeder.eternal-september.org!mx02.eternal-september.org!.POSTED!not-for-mail From: Knute Johnson Newsgroups: comp.lang.java.programmer Subject: Re: Animations with jTextPane Date: Sun, 10 May 2015 14:17:59 -0700 Organization: A noiseless patient Spider Lines: 188 Message-ID: References: <641b695c-da1e-47d7-95a0-554df722e433@googlegroups.com> <79d8c03d-890f-4c39-91c7-9a16e435447c@googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Sun, 10 May 2015 21:16:54 +0000 (UTC) Injection-Info: mx02.eternal-september.org; posting-host="9b3fcb0d22708969e4dc99e7aa0ef1f9"; logging-data="8091"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+oLv5VmdzstkKWNNxYv/NI" User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 In-Reply-To: <79d8c03d-890f-4c39-91c7-9a16e435447c@googlegroups.com> Cancel-Lock: sha1:9uL+8SCBx44qyryB1RIgz624VfQ= Xref: csiph.com comp.lang.java.programmer:31669 On 5/10/2015 13:28, H.L@operamail.com wrote: > Den søndag den 10. maj 2015 kl. 19.28.59 UTC+2 skrev Knute Johnson: >> So my idea may not work so good. I tried a little experiment where >> I used some photos from my website and create simple HTML pages and >> then loaded them one after another into the JTextPane with >> setPage(). I get the flashy too. You can try my test code below. >> The double buffering had no effect on the flashing. >> >> It may be easier to put the images in their own component where you >> can control the drawing better. >> >> I'll leave the HTML up for a couple of days. >> >> import java.awt.*; import java.awt.event.*; import java.io.*; >> import javax.swing.*; import javax.swing.text.*; >> >> public class test3 extends JTextPane implements Runnable { public >> test3() throws IOException { >> setPage("http://lonejuniper.com/0.html"); setDoubleBuffered(true); >> System.out.println(isDoubleBuffered()); } >> >> public void run() { int i = 0; try { while (true) { >> Thread.sleep(1000); int n = i; EventQueue.invokeLater(() -> { try >> { setPage(String.format( "http://lonejuniper.com/%d.html",n)); } >> catch (IOException ioe) { ioe.printStackTrace(); } }); if (++i == >> 24) i = 0; } } catch (InterruptedException ie) { >> System.out.println("program stopping"); } } >> >> public static void main(String... args) { EventQueue.invokeLater(() >> -> { try { JFrame f = new JFrame(); >> f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test3 t3 = new >> test3(); f.add(t3,BorderLayout.CENTER); f.pack(); >> f.setVisible(true); new Thread(t3).start(); } catch (IOException >> ioe) { ioe.printStackTrace(); } }); } } >> >> >> On 5/10/2015 08:08, H.L@operamail.com wrote: >>> >>> Thank you for helping me with this. We have not tried this, but >>> please note that we are continouusly changing what image is >>> shown. The web cam captures a new image and this is shown on the >>> screen, how could we do this updating with setDocument()? >>> >>> >>> Den søndag den 10. maj 2015 kl. 16.49.42 UTC+2 skrev Knute >>> Johnson: >>>> On 5/10/2015 02:57, H.L@operamail.com wrote: >>>>> >>>>> Hey >>>>> >>>>> We are using OpenCV to grab images from the web cam. The idea >>>>> is to show the feed in a jTextPane when the user selects to >>>>> show feed, otherwise other stuff can be shown in the pane. >>>>> This pane is in a JFrame with lots of other swing objects. >>>>> >>>>> Basic functionality: >>>>> >>>>> IplImage grabbedImage = >>>>> opencv_highgui.cvQueryFrame(capture); while ((grabbedImage = >>>>> opencv_highgui.cvQueryFrame(capture)) !=null) >>>>> jTextPane1.insertIcon(new >>>>> ImageIcon(grabbedImage.getBufferedImage())); >>>>> >>>>> >>>>> Now, we get problems because this shows multiple video >>>>> frames. Obviously, it keeps inserting a new image, so they >>>>> will be placed on top of each other. >>>>> >>>>> We tried to clear the pane and then repaint by doing like >>>>> this instead: >>>>> >>>>> this.removeIcon(); jTextPane1.repaint(); >>>>> jTextPane1.insertIcon(new >>>>> ImageIcon(grabbedImage.getBufferedImage())); >>>>> >>>>> Where removeIcon looks as can be seen below: >>>>> >>>>> But now, it gets flashy, the user can clearly see how the >>>>> pane is cleared and then repainted, just a flashy slow change >>>>> of images. >>>>> >>>>> So is there any way to get around both of these issues? >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> private void removeIcon() { for (int i=0; >>>>> i>>>> element = >>>>> jTextPane1.getStyledDocument().getCharacterElement(i); >>>>> AttributeSet attributeSet = element.getAttributes(); Icon >>>>> icon = StyleConstants.getIcon(attributeSet); if (icon != >>>>> null) { try { >>>>> >>>>> jTextPane1.getStyledDocument().remove(i, 1); >>>>> jTextPane1pane.getStyledDocument().insertString(i, " ", new >>>>> SimpleAttributeSet()); icon = null; } catch (Exception exc) >>>>> { System.out.println("Exception : " + exc.getMessage()); } } >>>>> } } >>>>> >>>>> >>>>> >>>> >>>> Have you tried just putting the image in a StyledDocument and >>>> using setDocument()? >>>> >>>> -- >>>> >>>> Knute Johnson >>> >> >> >> -- >> >> Knute Johnson > > Yes, this is quite exactly what we are experiencing. So are you > suggesting that we should use something else rather than a > JTextPane? If you just need to display an image in a Component, yes. It's not clear to me what else you have in that JTextPane besides your icon. The JTextPane appears to be clearing itself and then drawing the image. In a JComponent, you can just draw the image. No white flash as the background is drawn with the example below. I guess I wasn't seeing the flash in my program that I mentioned because the background is white and their wasn't much being drawn. import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.io.*; import java.net.*; import javax.imageio.*; import javax.swing.*; public class test4 extends JPanel implements Runnable { volatile BufferedImage image; public test4() { setPreferredSize(new Dimension(330,180)); } public void run() { int i = 0; while (true) { try { if (i > 23) i = 0; URL url = new URL( String.format("http://lonejuniper.com/%d.jpg",i++)); image = ImageIO.read(url); repaint(); Thread.sleep(1000); } catch (IOException|InterruptedException ex) { ex.printStackTrace(); } } } public void paintComponent(Graphics g) { if (image != null) g.drawImage(image,0,0,330,180,null); } public static void main(String... args) { EventQueue.invokeLater(() -> { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test4 t4 = new test4(); f.add(t4,BorderLayout.CENTER); f.pack(); f.setVisible(true); new Thread(t4).start(); }); } } -- Knute Johnson