argon bulletin board

Експертно търсене  

Новини:

Регистрирането на нови потребители е временно деактивирано.

Автор Тема: Tips & Tricks : HOWTO Scrollable JMenu in Java  (Прочетена 1484 пъти)

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

Еми ето днес с какво ме занима тук един познат и ме уби че няма удобен начин в 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
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die
Re: Tips & Tricks : HOWTO Scrollable JMenu in Java
« Отговор #1 -: 26.03.2007, 15:54:17 »

имаше и друг начин би трябвало да е нещо подобно на :
не работи има bug ( за java преди1.5 включително 1.5 ) май уш под 1.6 би работило :)

package test;



import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;

public class NewJFrame extends javax.swing.JFrame {
private JMenuBar menuBar;

private JMenu menu1;

public static void main(String[] args) {
NewJFrame inst = new NewJFrame();
inst.setVisible(true);
}

public NewJFrame() {
super();
initGUI();
}

private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig",
"Fish", "Horse", "Cow", "Bee", "Skunk" ,"Bird", "Cat", "Dog", "Rabbit", "Pig",
"Fish", "Horse", "Cow", "Bee","Bird", "Cat", "Dog", "Rabbit", "Pig",
"Fish", "Horse", "Cow", "Bee","Bird", "Cat", "Dog", "Rabbit", "Pig",
"Fish", "Horse", "Cow", "Bee"};
JList list = new JList(petStrings);
JScrollPane scrollPane = new JScrollPane(list);

menuBar = new JMenuBar();
setJMenuBar(menuBar);

menu1 = new JMenu();
menuBar.add(menu1);
menu1.setText("menu1");

menu1.add(scrollPane);

pack();
setSize(400, 300);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Както казах не работи всъщност държи се супер бъгаво чак е смях да го пуснеш
Активен