Force immediate layout and paint in Swing

repaint method in java swing
how to use paint method in java swing
java swing paint
java repaint not working
java force repaint
java paint program example
how to call paint method in java
java swing repaint

I cannot seem to force a layout in Swing. I have a JComponent added to a JLayeredPane and I set a border on the JComponent. Then, I want to immediately re-draw everything - not in the sense of "please do this asap" like invalidate(), but synchronously and immediately. Any help? I cannot seem to find the right method of doing this, and all my reading about invalidate(), validate(), repaint(), doLayout(), etc is just confusing me more!

According to this (see the section titled "Synchronous Painting") the paintImmediately() method should work.

Painting in AWT and Swing, JPanel can have a colored or whatever background (like a canvas) plus whatever it draws in its component.repaint() does not do the drawing immediately. Swing processes "repaint" requests in a slightly different way from the AWT, although the final result for the application programmer is essentially the same -- paint() is invoked. Swing doesthis to support its RepaintManager API (discussed later), as well as to improve paint performance. In Swing, painting can follow two paths, as described below: (A) The paint request originates on the first heavyweight ancestor (usually JFrame, JDialog, JWindow, or JApplet):

The most reliable way to get Swing to update a display is to use SwingUtilities.invokeLater. In your case, it would look something like

SwingUtilities.invokeLater(new Runnable {
                             public void run() { 
                                somecomponent.repaint();
                             }
                           });

I realize the 'invokelater' does not exactly sound like it does anything immediate, but in practice, events posted in this way tend execute pretty quickly compared to just calling e.g. somecomponent.repaint() directly. If you absolutely must make your control code wait for the GUI to update, then there is also invokeAndWait, but my experience is that this is rarely necessary.

See also: document on event dispatch in Swing.

[PDF] Draw, Paint, Repaint, let's assume I have a JFrame with FlowLayout. I add some components to it and adding my own paint(Graphics) method but then the effect of  You can set a panels layout manager to null. Do that, and then set the size of your panel to whatever you like. Just remember that any components you place on that panel will now have to have their locations specified also.

This is super old, but I found a simple solution, which I'll show with a JPasswordField:

var pw = new JPasswordField();
...
pw.paint(pw.getGraphics()); // paints immediately

How do I force a container to repaint? (Swing / AWT / SWT forum at , java.lang.Object. javax.swing.plaf.ComponentUI. Direct Known Subclasses: ButtonUI, from this class in order to delegate operations (painting, layout calculations, etc.) color if its opaque property is true , and then immediately calls paint . You need a component to paint on, like a JPanel. You need to @Override its paintComponent method; You can use a loop to paint using Graphics context; Use a flag to alternate between colors. Take a look at some Painting Graphics tutorials. In the mean time, give this a whirl

ComponentUI (Java Platform SE 7 ), Components A component is the fundamental user interface object in Java. Container objects group components, arrange them for display using a layout manager, and Swing asks a component to draw itself by calling its paint() method. paint() may be The setVisible() method returns immediately, without blocking. I have a section of code that processes a data packet. I want to flash a green "led" in the status bar to show that the data was received. The code below does not flash it. This makes sense since the UI never gets the processor (Arm9) to redraw the wid

Components - Learning Java, 4th Edition [Book], Open Java console on your browser and type the letter t. Then, your Java console will This thread is responsible for accepting input events and calling the paint() method. The programmer It then returns immediately. This type of behaviour  Also need to grab mozilla Rhino (not using any JS) but that is all. After that it is fairly smooth, just need to ask Logger to hide paint messages. Render is correct and speed is fair - as long as the document is simple. When you start to use less common tags or more complicated layout, Cobra falls apart pretty quickly.

The repaint() method and the GUI thread, Layout Management. Event Handling. Painting. Threads and Swing The getImage methods return immediately, so that you don't have to wait for an image to  Layout managers also can be reused easily by other containers, as well as other programs. Note: This lesson covers writing layout code by hand, which can be challenging. If you are not interested in learning all the details of layout management, you might prefer to use the GroupLayout layout manager combined with a builder tool to lay out your GUI.

Comments
  • I have tried this - myComponent.paintImmediately(myComponent.getBounds). No luck :( I think this may be because changing the border requires a new layout pass due to the border using some extra pixels on each side of the object
  • paintImmediately may be the way to go, but you still need to post it as an event using invokeLater or invokeAndWait, I think.
  • @Hamy Have you tried calling it on the parent component, that might allow for the layout change.
  • Unfortunately neither of those will work for my impl :/ I need the GUI update to happen immediately, not after the pending events have been processed. It's due to a flaw in my design that I need it this way, but unfortunately changing it would set me back almost two weeks and I have a deliverable tomorrow :/
  • Ok try this: use invokeAndWait, then inside the runnable call paintImmediately on the outer container. I think this is as close as you can get using Swing -- it will override previous calls to 'repaint,' if I'm not mistaken.
  • Unfortunately that didn't work either. To call invokeAndWait you have to spawn a new Thread. I have a very slow event happening immediately after this painting, and it begins execution before the runnable is started, resulting in the GUI freezing without this paint call having been performed yet
  • The invokeAndWait call does not spawn a new thread -- it just adds your Runnable to the event queue, and then blocks your current thread until the event is called. If you're still not seeing the 'change' when using invokeAndWait, then you're most likely repainting the wrong object. One way to check is to add debug output to your component's (g)paint method.