Link to home
Start Free TrialLog in
Avatar of bjg
bjg

asked on

Repainting a panel...

I am having a problem with repainting a panel.  I have a main panel, and I add other panels onto it.  Depending on which selection a user chooses for how many other panels they want added to it, I need to repaint the main panel with the correct number of panels added to it.  I have a Choice component, and they select which number of panels to add, then I have a button which gets the selected number of panels to add, and clears the main panel with mainpanel.removeAll() (from Container), and then I add the new amount of panels.  It works fine except I don't see the new panel unless I resize the frame or applet first.  What is the problem and how can I correct it?
Avatar of imladris
imladris
Flag of Canada image

You need to call invalidate on the main panel. It is part of class Component:

public void invalidate();

Avatar of bjg
bjg

ASKER

It didn't work?  Where, when, and why should I call invalidate()?
After the mainpanel.removeAll(), and the addition of the new panels it would be:

mainpanel.invalidate();

This will cause the panels layout manager to be called again which will cause all (new, in this case) subcomponents to be "positioned".

Avatar of bjg

ASKER

This is the code I have and it didn't work, the new settings only show up after I resize the applet in the appletviewer.

public void setCalendar()
      {
            currentDate.set(year, month, date);

            /*========================================================
              Find out what day of the week the first of the month
              falls on.
            ========================================================*/
            Calendar first = Calendar.getInstance();
            first.set(year, month, 1);      //Set to first day of month
            int first_day = first.get(Calendar.DAY_OF_WEEK) - 1;

            /*========================================================
              Determine total number of days in month, also check for
              leap years.
            ========================================================*/
            int totalDays = 0;
            
            if ((month == FEBRUARY) && (isLeapYear(year)))
                  totalDays = LEAP_YEAR_DAYS;
            else
                  totalDays = monthDays[month];

            /*========  Allocate correct number of DayCells for the month ======*/
            DayCell daycells[] = new DayCell[totalDays];

            canvas.removeAll();

            /*======== Add blank cells until reach first of the month ==========*/
            for (int j = 0; j < first_day; j++)
            {
                  Panel blank = new Panel();
                  blank.setBackground(Color.white);
                  canvas.add(blank);
            }

            for (int i = 0; i < 42 - first_day; i++)
            {
                  if (i < totalDays)
                  {
                        Calendar temp = Calendar.getInstance();
                        temp.set(year, month, i+1);
                        daycells[i] = new DayCell(temp);
                        daycells[i].setActionCommand("day");
                        daycells[i].addActionListener(this);
                        if ( compareDate(daycells[i].getDate(), today) )
                        {
                              daycells[i].setBackground(Color.black);
                              daycells[i].setForeground(Color.green);
                              daycells[i].requestFocus();
                        }
                        canvas.add(daycells[i]);
                  } else
                  {
                        Panel blank = new Panel();
                        blank.setBackground(Color.white);
                        canvas.add(blank);
                  }
            }
            canvas.invalidate();
      }

That looks fine. The only other suggestion I can think of making is a call to repaint, i.e.

canvas.invalidate();
canvas.repaint();

Avatar of bjg

ASKER

I tried that, and it doesn't work either.  I can't figure it out, its stupid that it will only repaint if I resize it...
Try calling validate() instead of invalidate().
ASKER CERTIFIED SOLUTION
Avatar of rans
rans

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of bjg

ASKER

I put:

canvas.validate();
repaint();

this worked.  Thanks.