Еми ето днес с какво ме занима тук един познат и ме уби че няма удобен начин в Java.
Значи идеята е ако имате JMenu с мнооого JMenuItems и естествено се получава проблемация под Java
нещата изглеждат ужасно показват се само първите N итема след които другите се скриват и няма как да се изберат.
В Windows приложения би трябвало да изглежда така :
http://isy-dc.com/~naiden/scrollableMenu.JPGе под Java немаше как да го направим така за това питах в форума на SUN за идеи :
както и да е в краина сметка "нещото " изглежда така :
http://isy-dc.com/~naiden/scrollableMenuBar.htmкод :
помощния клас за Combo

package test;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.plaf.basic.*;
public class ScrollablePopupMenu extends JComboBox
{
public ScrollablePopupMenu(ComboBoxModel aModel)
{
super(aModel);
setup();
}
public ScrollablePopupMenu(final Object items[])
{
super(items);
setup();
}
public ScrollablePopupMenu(Vector items)
{
super(items);
setup();
}
boolean keySelection = false;
myBasicComboBoxUI myCBUI;
private void setup()
{
myCBUI = new myBasicComboBoxUI();
setUI(myCBUI);
addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent ke)
{
if (ke.getKeyCode() == 10)
{
keySelection = false;
fireActionEvent();
return;
}
else if (!myCBUI.getPopup().isVisible())
{
ke.consume();
}
keySelection = true;
}
});
setPreferredSize(new Dimension(0, 0));
setVisible(true);
}
public void showPopup(int x, int y)
{
setLocation(x, y);
myCBUI.getPopup().show();
}
public ComboPopup getPopup()
{
return myCBUI.getPopup();
}
public void setSelectedItem(Object anObject)
{
Object oldSelection = selectedItemReminder;
if (oldSelection == null || !oldSelection.equals(anObject))
{
if (anObject != null && !isEditable())
{
boolean found = false;
for (int i = 0; i < dataModel.getSize(); i++)
{
if (anObject.equals(dataModel.getElementAt(i)))
{
found = true;
break;
}
}
if (!found)
return;
}
dataModel.setSelectedItem(anObject);
if (selectedItemReminder != dataModel.getSelectedItem())
selectedItemChanged();
}
}
public void contentsChanged(ListDataEvent e)
{
Object oldSelection = selectedItemReminder;
Object newSelection = dataModel.getSelectedItem();
if (oldSelection == null || !oldSelection.equals(newSelection))
selectedItemChanged();
if (!keySelection)
fireActionEvent();
}
class myBasicComboBoxUI extends BasicComboBoxUI
{ // just to be able to get to the popup
public ComboPopup getPopup()
{
return popup;
}
}
}
приложениицето
package test;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
public class JScrollableJMenu extends JFrame
{
public JScrollableJMenu()
{
init();
}
JMenuBar menuBar;
JMenu menu2;
public void init()
{
this.setLayout(new BorderLayout());
menuBar=new JMenuBar();
menu2=new JMenu("Test2");
menuBar.add(menu2);
String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig", "Fish", "Horse", "Cow", "Bee", "Skunk" };
final ScrollablePopupMenu petList = new ScrollablePopupMenu(petStrings);
petList.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println(petList.getSelectedItem());
}
});
menu2.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
popupMenuMouseClicked(petList, e);
}
});
this.getContentPane().add("North", petList);
this.setJMenuBar(menuBar);
}
private void popupMenuMouseClicked(final ScrollablePopupMenu petList, MouseEvent e)
{
petList.showPopup(menu2.getX(), menu2.getY());
}
public static void main(String[] args)
{
JScrollableJMenu m=new JScrollableJMenu();
m.setSize(500,500);
m.setVisible(true);
}
}
темата на форума на сън ( не се смеите на английския ) :
http://forum.java.sun.com/thread.jspa?messageID=9575628