PaintComponent, paint and repaint?

Hi everybody,
I am a little confused on the usage of these methods. I have two problems:
I have a JPanel inside a Jframe. In order to draw a Line2D object on this panel, I have to overwrite the paintComponent() method of JPanel. This causes two problems for me:
1) If I want to call removeAll() method upon click of a button inside the JPanel, and replace my drawing with something else, paintComponent() method gets called, and repaints my old drawing on the panel again. Meaning it would undo my removeAll() method. How can I have my class not call repaintComponent(), or how can I get rid of this problem.
2) Whenever I move another window on top of the panel, paintComponent gets called, and for some reason, it makes multiple copies of my drawing all over the panel. It looks like whereever I am moving the new window, my drawing gets carried with it!!! This messes my whole drawing. How can I get rid of this?
Thanks all.

Well, I am seeing the same problem even incorporaring your suggestion. Here is my code:
public void paintComponent(Graphics g){
super.paintComponent(g);
Line2D.Double line = null;
Circle parent = null;
Circle child = null;
double x_child;
double x_parent;
double y_child;
double y_parent;
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
// save transform in use
AffineTransform origTx = g2d.getTransform();
ListIterator iterator = globalViewVect.listIterator();
AffineTransform transform = new AffineTransform().getScaleInstance(50f, 50f).getTranslateInstance(10f, 10f);
while(iterator.hasNext()){
GlobalViewInfo gvi = (GlobalViewInfo)iterator.next();
g2d.setPaint(Color.black);
child = gvi.getChild();
parent = gvi.getParent();
x_child = child.getX() % 31 + 10;
y_child = child.getY() % 31 + 10;
if(parent == null) {//If this node is the root
System.out.println("This is the root");
else{
x_parent = parent.getX() % 31 + 10;
y_parent = parent.getY() % 31 + 10;
line = new Line2D.Double(x_parent, y_parent, x_child, y_child);
System.out.println("Line is : " + x_parent + " " + y_parent + " "
+ x_child + " " + y_child + " ");
g2d.setTransform(transform);
g2d.draw(line);
g2d.setPaint(Color.red);
g2d.setFont(new Font("Serif",Font.PLAIN,11)) ;
Circle c = new Circle();
c = child;
c.setX(x_child);
c.setY(y_child);
c.draw(g2d, transform);
g2d.setTransform(origTx);

Similar Messages

  • Stuck with the paint and repaint methods

    I am supposed to create a JApplet with a button and a background color. When the button is clicked the first time a word is supposed to appear (I got that part), when the button is clicked the second time the word is supposed to appear again in a different color and in a different location on the Applet (I got that part).
    The problem is that the first name is supposed to disappear when the second word appears. So I know I have to repaint the screen when the button is clicked the second time and draw the first string in the same color as the background color to make it invisible.
    My problem is I am not sure how I can code to apply different settings each time the button is clicked. Can anyone help? Please let me know if my explanation sucks. I will try to explain better. However here is the code I have so far. I added a counter for the button just for testing purposes.
    I just need some hints on what to do and if there is a easier way than using that if statement please let me know. I probably make it harder than it is.
    Thanks in advance and Merry Christmas.
    import javax.swing.*;
       import java.awt.*;
       import java.awt.event.*;
        public class DisplayMyName extends JApplet
        implements ActionListener
          String myName = "DOG";
          String myName1 = "DOG";
          JButton moveButton = new JButton("Move It");
          Font smallFont = new Font("Arial", Font.BOLD, 12);
          Font largeFont = new Font("Lucida Sans", Font.ITALIC, 20);
          int numClicks = 0;
          JLabel label = new JLabel("Number of button clicks:" + numClicks);
           public void init()
             Container con = getContentPane();
             con.setBackground(Color.RED);
             con.setLayout( new FlowLayout() );
             con.add(moveButton);
             con.add(label);
             moveButton.addActionListener(this);
           public void paint(Graphics g)
             numClicks++;
             label.setText("Number of button clicks: " + numClicks);
             if (numClicks == 2)
             { g.setFont(smallFont);
                g.setColor(Color.BLUE);
                g.drawString(myName, 50, 100);
                   else
             if (numClicks == 3)
             { g.setFont(largeFont);
                g.setColor(Color.YELLOW);
                g.drawString(myName, 100, 200);
           public void actionPerformed(ActionEvent move)
             repaint();
       }

    You're putting your program logic in the paint method, something you should not do. For instance, try resizing your applet and see what effect that has on number of button clicks displayed. This is all a side effect of the logic being in the paint method.
    1) Don't override paint, override paintComponent.
    2) Don't draw/paint directly in the JApplet. Do this in a JPanel or JComponent, and then add this to the JApplet. In fact I'd add the button, the and the label to the JPanel and add the label to the JApplet's contentPane (which usually uses BorderLayout, so it should fill the applet).
    3) Logic needs to be outside of paint/paintComponent. the only code in the paintComponent should be the drawing/painting itself. The if statements can remain within the paintComponent method though.
    4) When calling repaint() make sure you do so on the JPanel rather than the applet itself.
    For instance where should numClicks++ go? Where should the code to change the label go? in the paint/paintComponent method? or in the button's actionlistener? which makes more sense?
    Edited by: Encephalopathic on Dec 24, 2008 9:37 AM

  • Paint and repaint

    Hi I've got a simple question how to you repaint somthing that's not a Component?
    When I get the string I want to paint it on screen but I need to repaint first, how?
    import java.awt.*;
    import java.io.*;
    public class myList
    public String[] name = new String[1000];
    int Counter = 0;
    public void getFile(String str)
      name[Counter] = str;
      Counter++;
      //Want repaint here
    public void paint(Graphics g)
      name[0] = "Hej";
      for(int i = 0;i < name.length; i++)
       if(name[i] != null)
       g.drawString(name,10,50 + 20*i);

    I do not belive this is swing related since I want to get the method of repainting the AWT version of paint.
    Once again I'll show some code (stripped down for you)
    import java.io.*;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.filechooser.*;
    import java.net.*;
    public class myPanel
    JPanel panel;
    JButton openButton;
    myList ml = new myList();
    public myPanel()
      panel = new JPanel()
       public void paintComponent(Graphics g)
        super.paintComponent(g);
        ml.paint(g);
      openButton.addActionListener(new ActionListener()
       public void actionPerformed(ActionEvent e)
         //the file variable I get from a JFileChooser
         //This is where a real application would open the file.
         ml.getFile(file.getName());
         panel.repaint();
         //I maybe want to repaint ml.paint() here
      panel.add(stopButton);
      panel.add(openButton);
      panel.add(saveButton);
    import java.awt.*;
    import java.io.*;
    public class myList
    public String[] name = new String[1000];
    int Counter = 0;
    public void getFile(String str)
      name[Counter] = str;
      Counter++;
      //Want a repaint here
    public void paint(Graphics g)
      for(int i = 0;i < name.length; i++)
       if(name[i] != null)
       g.drawString(name,10,50 + 20*i);
    //Or here

  • Applet Painting and Repainting

    I have two issues that I think to be related and hope that someone may be able to shed some light on this. I have a problem with an applet that is running within a JSP page. At initial loading, the applet randomly displays with a blank page. If I reload the jsp page from the browser the applet will recover and display appropriately. This happens on both Internet Exploder and Firefox browsers.
    I also have a problem with Components within the applet that, I hope, are related. I have a JTable component that, when I make changes to it, it manages to refresh, but not completely. Some of the data that has changed doesn't refresh but the rest of it does. Again, if I refresh the applet pane the value restore to what is expected.
    I have a repaint call in place at each instance, but that is not working. Are there any suggestions or maybe something else I can try to get this to work as expected. I am fairly inexperienced with applets so any advise and detail would be greatly appreciated.

    You probably can't do this with threads. Rule #1 of threading is that you cannot determine the order of execution, and you basically have no control over this. If you need the images and sound to be displayed sequentially, then by all means download them or load them with separate threads. But you must display them in the same thread to get them displayed sequentially.
    Alan

  • What's the difference between paint and paintComponent?

    can any body tell me the difference between paint and paintComponent?and when i should use paint and when use paintComponent?
    I know that when I use repaint,it will clear all the objects and then paint again?
    is there a method similar to repaint?
    thanks in advance!

    and when i should use paint and when use paintComponent?Simple answer:
    a) override paint() when doing custom painting on an AWT component
    b) override paintComponent() when doing custom painting on a Swing component
    Detailed answer:
    Read the article on [url http://java.sun.com/products/jfc/tsc/articles/painting/index.html]Painting in AWT and Swing.
    Read the Swing tutorial on [url http://java.sun.com/docs/books/tutorial/uiswing/14painting/index.html]Custom Painting.

  • Custom paint() and rare repainting

    I have made custom paint() method like this:
    @Override
              public void paint(Graphics  g){
                   int time;               
                   if(renderer != null)
                        renderer.updateImage();
                   time = Simulation.getCurrentStepTime();          
                   if(time>=0)          labelCurrentTimeVal.setText(""+time);
                   else              labelCurrentTimeVal.setText("-");
                   time = Simulation.getAverageStepTime();          
                   if(time>=0)          labelAvgTimeVal.setText(""+time);
                   else              labelAvgTimeVal.setText("-");
                   super.paint(g);
              }     I have some calculations going on in the background (separate thread). 'renderer' is responsible for repainting the JLabel holding an ImageIcon (which gets changed by the calculations). The case is that my background calculations take a few seconds. After they're done I call the repaint() method, which updates the image and paints the whole thing.
    My problem is that I want to have up-to-date info on how much the iteration is taking so I`ve made the labelCurrentTimeVal JLabel to display it. The label only repaints when I call the repaint() method. However when I keep moving some slider in this panel repaint gets called all the time (I can see the labelCurrentTimeVal value changing constantly as I move the knob).
    So what should I do to make the repaint() method get called often enough (20-30 times /sec to get about 20-30 fps)? I tried creating a different thread that calls repaint all the time (just to test it) and it doesn't solve the case.new Runnable() {
                public void run() {
                     while(true)
                          if(MainWindow.instance != null)
                               MainWindow.instance.repaint();
              };

    I`ve made same code to represent the problem. The calculationThread does the calculations - in this case sets the iteration counter and the repaintThread is supposed to update the GUI and repaint it once in a while. GUI doesn't update at all and I don't get why?
    import java.awt.Dimension;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    public class Main extends JFrame{     
         private JPanel panel;
         private JLabel label;
         public static Main window;
         private Runnable calcThread,repaintThread;
         private static int it;
         public static void main(String[] args) {
              new Main();
         private void createComponents(){
              window = this;
              panel = new JPanel();
              label = new JLabel("iteration:");
              panel.setPreferredSize(new Dimension(200,200));
              panel.add(label);
              this.add(panel);
              this.pack();
              this.setVisible(true);
         public Main(){
              createComponents();
              calcThread = new Runnable(){
                   public void run(){
                        int i=0;                    
                        while(true){                         
                             Main.it = i;
                             System.out.println("check - iteration: "+i);
                             i++;
              repaintThread = new Runnable(){
                   public void run(){
                        while(true){
                             try{
                                  wait(30);
                                  label.setText("iteration: "+it);     
                                  window.repaint();
                             }catch(InterruptedException e){}
              calcThread.run();
              repaintThread.run();
    }

  • Painting and using different Layers

    Hi,
    I have to develop a Swing interface where i have to do lot of painting,
    Like there will be a background which will be showing some strips with different colors, which will be stable,
    On this background I have to draw some rectangle , off different size,
    and add the function so the user can click on the rectangle and drag it and drop it
    I have to develop a kind of scheduling , like microsoft scheduler or take a look at the following example
    http://www.ilog.com/products/jviews/demos/activitychart/index.cfm
    I need some help in finding some tutorial on how to use different panes in JApplet , like th layered panes, the glass panes etc
    Any advice on developing such an Applet
    Ashish

    Hi Shannon,
    I already have subclassed JPanel and override the paintComponent method to do all the painting , but the problem i am having is there is a lot of painting and when ever i move the mouse over it repaint method is called and so there is chance that the applet will not work if the graphics card of the user is not good,
    Can u point me to some example where a RepaintManager() is used,
    also i want to use layers so i can avoid the repainting of the background even if the user clicks on it, or drap and drops the rectangle drawn
    Ashish

  • Non-modal JDialog is not painted and blocks the GUI

    I have developed a GUI that's basically a JFrame with a JDesktopPane.
    The user can, via a menu item, pop up a JDialog that contains some JLists and then select some value from it. Once he/she has done the selection and clicks on OK, the dialog disappears (data processing is then done in the main GUI) and comes back once a specific event has happened. The user then selects other data and so on, until he/she clicks on Cancel, which definitely disposes of the JDialog.
    The graphics of the JDialog are build in the class constructor, which does a pack() but does not make the dialog visible yet. The dialog appears only when doSelection() is called.
         /** Called the first time when user selects the menu item, and then
         when a specific event has happened. */
         public Data[] doSelection() {
              dialog.setVisible(true);
              // ... Code that reacts to user's input. Basically, the ActionListener
              // added to the buttons retrieves the user's selection and calls
              // dialog.setVisible(false) if OK is clicked, or calls dialog.dispose()
              // if Cancel is clicked.
         }Now, everything works fine if the JDialog is modal, but if I make it non-modal only the window decorations of the JDialog are painted, and the control doesn't return to the main GUI. Calling doLayout() or repaint() on the doSelection() has no effect. How can this be fixed?
    I hope I have been able to explain the problem satisfactorily, I could not create a suitable SSCCEE to show you. Thanks in advance for any hint.

    Ok, I've taken some time to think about this problem and I've modified the code a bit.
    Now the dialog shows itself and is responsive (i.e. its JLists can be operated), but the Ok button does not close the dialog as I'd want. I believe that I'm messing up things about threading, and the operations in actionPerformed() should be carried out in another thread, if possible.
    Thanks in advance for any hint / suggestion / comment / insult.
         private Data[] selection;
         /** Constructor */
         public MyDialog() {
              // ... Here is the code that builds the dialog...
              dialog.setModal(false);
              dialog.pack();
              // Note that the dialog is not visible yet
         public Data[] doSelection() {
              operatorAnswer = NONE_YET;
              dialog.setVisible(true);          
              while (operatorAnswer == NONE_YET) {
                   try {
                        wait();
                   } catch (InterruptedException e) { }
              return (operatorAnswer == OK ? selection : null);
         public void actionPerformed(ActionEvent evt) {
              if (okButton.equals(evt.getSource())) {
                   operatorAnswer = OK;
                   retrieveSelection();
                   dialog.setVisible(false);
              else if (cancelButton.equals(evt.getSource())) {               
                   operatorAnswer = CANCEL;
                   dialog.dispose();
         private void retrieveSelection() {
              // ... Here is the code that retrieves selected data from the dialog's JLists
              // and stores it in the "selection" private array...
              notifyAll();
         }

  • Component resize, paint and AffineTransform

    Hello,
    I am resizing a JInternalFrame that contains a JPanel.
    When I call:
    MyJPanel.repaint();The paint function gets the dimensions of the JPanel
    using getWidth() and getHeight(), once, at the start of the
    paint function. The function then proceeds to plot some lines and
    points on a graph. Everything appears to work fine for lines and points (ie: drawOval).
    The function then goes on to draw some text for the axes of the graph. The Y axis
    text plots fine. The X axis text is rotated using AffineTransform and plots intermittently
    with the correct and incorrect position.
    Calling repaint() for the JPanel, without resizing,
    everything renders in the proper place
    via the overridden paint() procedure for that panel.
    When I resize the JInternalFrame, thus causing the
    JPanel to also automatically resize and repaint, the JPanel
    paints all lines and points in the correct locations
    with respect to the bounds of the JPanel. The
    Y axis text, drawn using drawText() plots in the correct place.
    The X axis text then plots in the wrong place after AffineTransform
    positioning in a location that would indicate it is transforming based on the
    coordinate system of the JInternalFrame rather than the JPanel (??).
    To create the text transform I am calling the following function:
    public void drawRotatedText(Graphics g, String text, int xoff, int yoff, double angle_degrees){
                        Graphics2D g2d=(Graphics2D)g;
                        AffineTransform old_at=((Graphics2D)g).getTransform();
                        AffineTransform at = new AffineTransform(old_at);
                        at.setToTranslation(xoff, yoff);
                        at.rotate((angle_degrees/360.0)*Math.PI*2.0);
                        g2d.setTransform(at);
                        g2d.drawString(text, 0, 0);
                        g2d.setTransform(old_at);
                    }The parameter Graphics g is the Graphics passed from public void MyJPanel.paint(Graphics g) .
    Why would AffineTransform get confused regarding which component the Graphics is coming from?
    More importantly, how can I avoid the problem?
    Thanks,
    P

    >
    To create the text transform I am calling the following function:
    public void drawRotatedText(Graphics g, String text, int xoff, int yoff, double angle_degrees){
    Graphics2D g2d=(Graphics2D)g;
    AffineTransform old_at=((Graphics2D)g).getTransform();
    AffineTransform at = new AffineTransform(old_at);
    at.setToTranslation(xoff, yoff);
    at.rotate((angle_degrees/360.0)*Math.PI*2.0);
    g2d.setTransform(at);
    g2d.drawString(text, 0, 0);
    g2d.setTransform(old_at);
    The problem is with the use of at.setToTranslation(xoff, yoff); instead of at.translate(xoff, yoff).
    After changing that the problem cleared up.
    P

  • Drawing graphs and repaint issues

    Hi, I'm trying to create a simple scrollable graph. Everything works fine unless I scroll it very slowly or really, really fast. It's all gets messy then - lines to do not seem to be continous, but rather have a lot of empty space. Especially when I press an arrow on the scrollbar and simply hold it - in this case all I get is a bunch of dots.
    It looks like that I'm using an inneficient way to draw the graph (I'm simply using drawLine() method, and repaint() isn't fast enough to redraw everything. Is there another way in Java to make it more efficient?
    Here is my code:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.math.*;
    import java.util.*;
    import java.awt.Color;
    public class TestGraph2 extends JFrame{     
    JScrollBar vb = new JScrollBar();
    int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER;
    int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
    JPanel panel = new JPanel();
    Graph graph = new Graph();
         public TestGraph2() {
              addWindowListener(new WindowAdapter()
              {     public void windowClosing(WindowEvent ev)      
                   {     dispose();               System.exit(0);}});     
    JScrollPane jsp = new JScrollPane(graph, v, h);
    setSize(750,550);     
    getContentPane().setLayout(new GridLayout(1,1));
    getContentPane().add(panel);
    panel.setLayout(new FlowLayout());
    jsp.setPreferredSize(new Dimension(600,500));     
    panel.add(jsp);
    graph.setPreferredSize(new Dimension(4000, 500));
    setVisible(true);                    
         public class Graph extends JPanel
              Graphics2D G;
              public Graph() {
    public void paintComponent(Graphics g) {
         super.paintComponent(g);
         G = (Graphics2D) g;
         G.setColor(Color.white);
         G.fillRect(40,40,graph.getWidth()-80,graph.getHeight()-80);
    int xold=39;
    int xnew=0;
    int yold=graph.getHeight()-39;
    int ynew=0;
              for(int i=39; i<=4000; i=i+10){
              xnew=i;
              int temp = (int)(Math.random() * graph.getHeight()-39);     
              ynew = graph.getHeight()-39-temp;
              if (ynew<39)
                   ynew=39;
              if(ynew>graph.getHeight()-39)
                   ynew=graph.getHeight()-39;
         G.setColor(Color.red);     
              G.drawLine(xold, yold, xnew, ynew);
              xold=xnew;
              yold=ynew;}
    public static void main (String[] args) {     
                                  new TestGraph2();}
         

    Anyone, please?

  • Question about drawLIne(x1,y1,x2,y2) and repaint()

    i am doing this project, which i suppose to use drawLine and repaint() to generate graphs. my problem is, every time i hit a new button it will call the repaint() then my old graph is gone, only the new graph is left.
    for example
    i have 4 buttons. movesouth() movenorth() moveeast() movewest()
    when i hit movesouth two times there should be a staight line, when i hit movewest() my old graph is gone() it only left me with 1 unit to west cuz i have repaint() inside my actionPerformed function, my question is: is there a way that i can redraw these line without calling repaint () ? cuz repaint is kinda like redraw the new stuff and forget about the old ones, however i would like to keep the old one while adding the new graph to it.
    your suggestions would be great appreciated.

    well of course, your Graphics-Object is of the type Graphics2D, you just need a cast so that the compiler is happy ;-)
    Its the same Graphics2D object/instance as withought the cast...
    lg Clemens

  • I have Photoshop CS6 Extended Students and Teachers Edition.  When I go into the Filter/Oil paint and try to use Oil paint a notice comes up "This feature requires graphics processor acceleration.  Please check Performance Preferences and verify that "Use

    I have Photoshop CS6 Extended Students and Teachers Edition.  when I go into the Filter/Oil paint and try to use Oil Paint a notice comes up "This feature requires graphics processor acceleration.  Please Check Performance Preferences and verify that "Use Graphics Processor" is enabled.  When I go into Performance Preferences I get a notice "No GPU available with Photoshop Standard.  Is there any way I can add this feature to my Photoshop either by purchasing an addition or downloading something?

    Does you display adapter have a supported  GPU with at least 512MB of Vram? And do you have the latest device drivers install with Open GL support.  Use CS6 menu Help>System Info... use its copy button and paste the information in here.

  • Report painter  and drill down reports

    Hi SAP gurus,
                   Can any froward configuration of  report painter  and drill down reports.
       iassign points

    Hiii Sai Krishna,
    can u forward the same documentation to me..plsss
    my mail id - [email protected]
    thanks in advance
    regards
    ramki

  • Difference between Report painter and abap query .

    can anyone please tell me the difference between the report painter and the ordinary alv,clasical reporting and also the difference between Report painter and abap query. How the output format will be in Report painter. If anyone has any documents please send it to
    [email protected]
    Thanks,
    Joseph.

    hi,
    ABAP Query is an ABAP Workbench tool that enables users without knowledge of the ABAP programming language to define and execute their own reports.
    In ABAP Query, you enter texts and select fields and options to determine the structure of the reports. Fields are selected from functional areas and can be assigned a sequence by numbering.
    link for abap query --
    https://forums.sdn.sap.com/click.jspa?searchID=221911&messageID=2790992
    whereas the Report Painter enables you to report on data from various applications. It uses a graphical report structure that forms the basis for the report definition. When defining the report, you work with a structure that corresponds to the final structure of the report when the report data is output.
    link for report painter --
    https://forums.sdn.sap.com/click.jspa?searchID=221874&messageID=1818114
    Regards,
    pankaj singh
    Message was edited by:
            Pankaj Singh
    Message was edited by:
            Pankaj Singh

  • Report Painter and Report Writer (URGENT)

    Hi All,
         Please can you send me Step by Step screen shots Configuration document for Report Painter and Report Writer,
    If any body send relavent data i will give reword points,
    Regards,
    TML

    Hi,
    see the below link cfor complete documentaion of report painter.
    http://www.virtuosollc.com/PDF/Get_Reporter.pdf
    Thanks.

Maybe you are looking for

  • Need Help!!! Question about Etherchannel

    Greetings All, Has anyone here ever experienced shuting down the Port-Channel Interface of a switch but still for some reason the switches still pass traffic?

  • DVI toHDMI with Audio

    I have a Macbook Pro, I'm buying accessories so I can see and hear my computer thru my HD flatscreen TV.    Does anyone know if my 17 inch Macbook Pro will allow audio out through the Mini-DP interface?  Thanks!

  • List of phone calls

    I was wondering if there is a way that I can get a list of calls that I have made from my land line for a specific date. I have unlimited service for both my local and long distance and tried to use the custom report.but nothing shows up. Do I have t

  • Problem with creating a collection from query

    This is driving me nuts. What I am trying to do is create a collection but the sql to create it is produced dynamically. The query I want to end up with in this example is - select pr.code,pr.description, max(decode(pe.period_beginning,'01-NOV-08',fe

  • [solved] libreoffice opens in German language not english

    Title says it all. Basically libreoffice opens up and all the menus and things are in german so naturally I can't read any of it. Is there any way to change this? Last edited by SiegeMachine (2011-09-04 23:32:51)