Java Discussion: Need Guru for Panels

by Earthweb Staff

Our users discuss a very specific problem in applying paint methods in JPanel, involving a sorting algorithm and a timer. See if you can come up with a better solution.

Welcome. Click here to access the new home of Gamelan's discussions on Java.

From the Gamelan Forum...


Cunduro Caca - 01:56am Apr 8, 2002 EDT

Hi! I am implementing a program where I have six panels which extend JPanel. In each of them, I have little dots moving according to how they are sorted by a sorting algorithm (quicksort, etc.) I want to be able to switch the panels and place them in order of performance, from left to right and top to bottom (so first row 1st, 2nd, 3rd and second row 4th, 5th, 6th) as the sorting algorithms are running (so they should be switching around the whole time). The way I repaint my panels is all at once by using the paintImmediately method, which I trigger at regular time intervals by a timer. My question is, how can I switch the panels, which are in a gridBagLayout? In handling the timer event, just before repainting, I tried re-specifying myConstraints, applying them to each panel, calling content.remove(specificPanel), and then content.add(specificPanel), but the program just stops.



Norm R - 05:57pm Apr 8, 2002 EDT

Here's an idea: Instead of moving the JPanels around, have their paintComponent() method call another class with a method: paintIt() to do the painting. Have an array in the main program that holds instances of this class with an instance for each panel. When you create the JPanel, pass it the index position it is to use when calling the paintIt() method. To change where a paintIt() method displays its stuff, swap the contents of the array around.

Some code samples:

   // Define a class that will do the painting for the Panels 
   abstract class DrawPanel { 
      public abstract void paint(Graphics g, JPanel p); 
   // Define an array to hold pointers to all the painting routines 
   DrawPanel[] painters = new DrawPanel[2]; 


painters[0] = new DrawPanel() { 
         public void paint(Graphics g, JPanel p) { 
// System.out.println("paint p1 " + p.getBounds()); 
            g.fillOval(0,0, 50, 50); 
            g.drawString("Panel One", 10, 25); 

JPanel p1 = new JPanel() { 
         int dpIdx = 0; // index to this panel's painter 
         public Dimension getPreferredSize() { 
            return new Dimension(100, 50); 
         public void paintComponent(Graphics g) { 
            painters[dpIdx].paint(g, this); // go use our painter 

We hope you'll participate in the give and take of information with your peers that has been a hallmark of our site since the early days of Java technology.

If you've got a problem, here's the perfect place to ask others for help solving it. If you've got advice, here's the perfect place to help build a community of like-minded Java specialists. Enjoy!

The Dalang

This article was originally published on Thursday Apr 11th 2002
Mobile Site | Full Site