Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4530303

JPopupMenu Repaint Slow

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P4 P4
    • 1.4.1
    • 1.4.0
    • client-libs
    • hopper
    • x86
    • windows_2000
    • Verified



      Name: ddT132432 Date: 11/21/2001


      java version "1.4.0-beta3"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta3-b84)
      Java HotSpot(TM) Client VM (build 1.4.0-beta3-b84, mixed mode)

      Following is a subclass of JMenu that scrolls a list of menu items. This works
      fine in JDK1.3.1. With JDK1.4 beta3, menu items are removed from the popup but
      the new menu items don't appear until the scroll operation is completely done.

      import java.awt.*;
      import java.awt.event.*;
      import javax.swing.*;
      import java.util.Vector;

      public class TimerTest extends JMenu implements SwingConstants
      {
      protected int scrollRate = 100;

      protected Vector menuItemVector = new Vector(100, 25);

      protected int firstDisplayed = 0;

      protected int lastDisplayed = 0;

      public ScrollButton upButton;

      public ScrollButton downButton;

      public TimerTest(String text)
      {
      super(text);

      upButton = new ScrollButton("Up", TOP);

      downButton = new ScrollButton("Down", BOTTOM);
      }

      public JMenuItem add(JMenuItem menuItem)
      {
      menuItemVector.add(menuItem);

      return menuItem;
      }

      public void setPopupMenuVisible(boolean b)
      {
      if (!isEnabled())
      return;

      if (b)
      {
      super.removeAll();

      super.add(upButton);

      upButton.setVisible(false);

      firstDisplayed = lastDisplayed = 0;

          for (int i = 0; i < 15; i++)
      {
      Component menuItem = (Component)menuItemVector.get(i);
      super.add(menuItem);
      lastDisplayed++ ;
      }

      super.add(downButton);

      downButton.setVisible(true);
      }
      super.setPopupMenuVisible(b);
      }

      protected boolean lastItemDisplayed()
      {
      return lastDisplayed == menuItemVector.size() - 1;

      }

      protected boolean firstItemDisplayed()
      {
      return firstDisplayed == 0;

      }

      protected synchronized void scrollUp()
      {
      if (lastItemDisplayed())
      {
      downButton.setVisible(true);
      super.remove(getDownButtonPosition() - 1);
      lastDisplayed--;
      }

      firstDisplayed--;

      super.add((Component) menuItemVector.get(firstDisplayed), 1);

      if (firstItemDisplayed())
      {
      upButton.setVisible(false);
      }
      else
      {
      super.remove(getDownButtonPosition() - 1);
      lastDisplayed--;
      }

      repackAndRepaintPopup();
      }

      protected synchronized void scrollDown()
      {
      if (firstItemDisplayed())
      {
      upButton.setVisible(true);
      super.remove(1);
      firstDisplayed++;
      }

      lastDisplayed++;

      super.add((Component) menuItemVector.get(lastDisplayed),getDownButtonPosition());

      if (lastItemDisplayed())
      {
      downButton.setVisible(false);
      }
      else
      {
      super.remove(1);
      firstDisplayed++;
      }

      repackAndRepaintPopup();
      }

      public int getDownButtonPosition()
      {
      int result = -1;
      for (int i = 0; i < super.getMenuComponentCount(); i++)
      {
      if (super.getMenuComponent(i) == downButton)
      {
      result = i;
      break;
      }
      }
      return result;
      }

      protected void repackAndRepaintPopup()
      {
      getPopupMenu().pack();
      getPopupMenu().paintImmediately(getPopupMenu().getBounds());
      }

      protected class ScrollButton extends JMenuItem
      {
      protected Object scrollingMutex = new Object();

      protected boolean scrolling = false;

      protected int direction;

      public ScrollButton(String text, int direction)
      {
      super(text);

      if (direction == TOP)
      this.direction = TOP;
      else
      this.direction = BOTTOM;

      addMouseListener(new ScrollMouseListener());
      }

      public boolean isScrolling()
      {
      boolean result = false;
      synchronized(scrollingMutex)
      {
      result = scrolling;
      }
      return result;
      }

      public void setScrolling(boolean b)
      {
      synchronized(scrollingMutex)
      {
      scrolling = b;
      }
      }

      public void startScroll()
      {
      setScrolling(true);

      ScrollAction s = new ScrollAction(direction);

      s.startTimer();
      }

      public void initLook(String text, Icon icon)
      {
      init(text, icon);
      }

      protected class ScrollAction extends AbstractAction
      {
      private Timer timer;

      private int direction;

      public ScrollAction(int direction)
      {
      super();
      if (direction == TOP)
      this.direction = TOP;
      else
      this.direction = BOTTOM;

      timer = new Timer(scrollRate, this);
      }

      public void startTimer()
      {
      timer.start();
      }

      public void actionPerformed(ActionEvent E)
      {
      if (!(isScrolling() && isVisible() && TimerTest.this.isPopupMenuVisible()))
      {
      ScrollButton.this.setScrolling(false);
      timer.stop();
      }
      else
      if (direction == TOP)
      TimerTest.this.scrollUp();
      else
      TimerTest.this.scrollDown();
      }
      }

      protected class ScrollMouseListener extends MouseAdapter
      {
      public void mouseEntered(MouseEvent evt)
      {
      if (ScrollButton.this.isScrolling())
      return;

      ScrollButton.this.startScroll();
      }

      public void mouseExited(MouseEvent e)
      {
      ScrollButton.this.setScrolling(false);
      }
      }
      }

      public static void main(String[] args)
      {
      JFrame frame = new JFrame("TestTimer");
      JMenuBar menuBar = new JMenuBar();
      frame.setJMenuBar(menuBar);
      JMenu viewMenu = new JMenu("View");
      viewMenu.setMnemonic('v');
      menuBar.add(viewMenu);

      TimerTest testMenu = new TimerTest("Test");
      testMenu.setMnemonic('t');
      viewMenu.add(testMenu);
      for (int i = 0; i < 50; i++)
      testMenu.add(new JMenuItem((new Integer(i)).toString()));

      JPanel panel = new JPanel();
      panel.add(new JLabel("Activate the View\\Test menu and place cursor over down button to initiate scrolling"));
      frame.getContentPane().add(panel);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.show();
      }
      }
      (Review ID: 136076)
      ======================================================================

            peterz Peter Zhelezniakov
            ddressersunw Daniel Dresser (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: