-
Bug
-
Resolution: Fixed
-
P4
-
1.4.0
-
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)
======================================================================