Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Scroll в JPopupMenu


Автор: Asal 24.3.2008, 19:09
Доброго времени суток.

Я опять с вопросом по поводу попап-меню.
Как добавить в попап скрол когда много итемов нем ?
Код

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Test extends JFrame {
  private JButton btn = new JButton("Test");
  private JPopupMenu popupMenu = new JPopupMenu("TEST Popup");

  public Test() {
    this.add(btn);
    JMenuItem item;
    for (int i = 0; i < 150; i++) {
      item = new JMenuItem("Item - " + i);
      item.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          btn.setText("Show ");
        }
      });
      popupMenu.add(item);

    }

    btn.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        showPopup();
      }
    });

    btn.addKeyListener(new KeyAdapter() {
      public void keyReleased(KeyEvent e) {
        if (e.getKeyChar() == KeyEvent.VK_SPACE)
          showPopup();
      }
    });
  }

  public void showPopup() {
    Point point = btn.getLocation();
    popupMenu.show(btn, 0, point.y + btn.getHeight());
  }

  public static void main(String[] args) {
    JFrame frame = new Test();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

}

пробовал разные варианты  smile, но ничего толкового не получилось подскажите пожалуйста

Автор: Asal 25.3.2008, 11:11
Где-то видел в попапе две кнопки, одна находится сверху, другая - снизу и когда на них наводишь, то список прокручивается.
Если кто подскажет как такое сделать, будет шикарно  smile 

Автор: dorogoyIV 25.3.2008, 12:32
используй JList
Код

   Object [] data=new Object [100];
   for(int i=0; i < data.length; i++)
   {
    data [i]=new String(i+" ");
   }

   JList jList=new JList(data);
   jList.setVisibleRowCount(5);
   popupMenu.add(new JScrollPane(jList));

Автор: Asal 25.3.2008, 13:38
Почти получилось )))
Код

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

public class Test extends JFrame {
  private JButton btn = new JButton("Test");
  private JPopupMenu popupMenu = new JPopupMenu("TEST Popup");
  private JList jList = new JList();

  public Test() {
    this.add(btn);
    JMenuItem item;
    for (int i = 0; i < 150; i++) {
      item = new JMenuItem("Item - " + i);
      item.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          btn.setText("Show ");
        }
      });
      jList.add(item);
    }
    jList.setVisibleRowCount(15);
    popupMenu.add(new JScrollPane(jList));

    btn.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        Point point = btn.getLocation();
        popupMenu.show(btn, 0, point.y + btn.getHeight());
      }
    });
  }

  public static void main(String[] args) {
    JFrame frame = new Test();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }
}


теперь показывается попап нужного размера. но абсолютно белый  smile 
что опять не так ?   smile 

Автор: dorogoyIV 25.3.2008, 13:45
 smile 
не надо в JList пихать JMenuItem.
посмотри в javadoc - какие конструкторы есть у JList

Автор: Asal 25.3.2008, 14:16
Допустим я буду туда пихать String
Код

String[] str = new String[150];
    for (int i = 0; i < 150; i++) {
      str[i] = "Item - " + i;
    }
    jList = new JList(str);
    jList.setVisibleRowCount(15);
    jList.addListSelectionListener(new ListSelectionListener() {
      public void valueChanged(ListSelectionEvent e) { //тут типо отлавливаем нажатие на элемент списка
        btn.setText("" + e.getLastIndex());
      }
    });
    popupMenu.add(new JScrollPane(jList));

но стесняюсь спросить  smile как попап закрыть ?

Автор: dorogoyIV 25.3.2008, 15:09
Код

 public void valueChanged(ListSelectionEvent e)
 {
  btn.setText(jList.getSelectedValue().toString());
  popupMenu.setVisible(false);
 }


еще предвижу вопрос - "как выделять в листе при наведении мыши?"  smile 
такой упрощенный вариант:
Код

  jList.addMouseListener(new MouseAdapter()
  {
   public void mouseEntered(MouseEvent e)
   {
    int height = e.getPoint().y;
    Rectangle r = jList.getCellBounds(0, 0);
    int item_height = (int)r.getHeight();
    int index = height/item_height;
    jList.setSelectedIndex(index);
   }
  });

Автор: Asal 25.3.2008, 15:41
dorogoyIV, большое спасибо за помощь  smile 
про
Код

popupMenu.setVisible(false);

я сразу подумал, но испугало то, что в примере который я привел, попап после нажатия по элементу в списке исчезал и что бы он опять 
появился надо было два раза нажимать по кнопке

P.S.
Цитата(dorogoyIV @  25.3.2008,  15:09 Найти цитируемый пост)
такой упрощенный вариант:

спасибо  smile я решил без этого сделать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)