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


Автор: Asal 19.3.2008, 16:52
Добрый день.
Пытался создать кнопку с попАп меню, но наткнуля на камень преткновения.
Кнопку с попАп я создаю следующим образом
Код

import javax.swing.*;
import java.awt.*;
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 item1 = new JMenuItem("Item1");
    item1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        btn.setText("Show");
        popupMenu.setVisible(false);
      }
    });
    JMenuItem item2 = new JMenuItem("Item2");
    item2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        btn.setText("Show");
        popupMenu.setVisible(false);
      }
    });
    popupMenu.add(item1);
    popupMenu.add(item2);
    btn.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        Point point = btn.getLocationOnScreen();
        point.setLocation(point.getX(), point.getY() + btn.getSize().getHeight());
        popupMenu.setLocation(point);
        if (popupMenu.isVisible()) {
          btn.setText("Show");
          popupMenu.setVisible(false);
        } else {
          btn.setText("Hide");
          popupMenu.setVisible(true);
        }
      }
    });
  }

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

Кнопка создается, по нажатию на нее появляется под ней меню, но ...
вот мои камни преткновения;
1. если окно с кнопкой передвинуть, то меню остается на месте. Как привязать меню к кнопке ?
2. Если мышкой щелкнуть по другому элементу окна, то меню должно исчезнуть. Как сделать ?

хотелось бы сделать такую кнопку

Автор: dorogoyIV 20.3.2008, 11:00
Код

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 item1 = new JMenuItem("Item1");
    item1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        btn.setText("Show 1");
//        popupMenu.setVisible(false);
      }
    });
    JMenuItem item2 = new JMenuItem("Item2");
    item2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        btn.setText("Show 2");
//        popupMenu.setVisible(false);
      }
    });
    popupMenu.add(item1);
    popupMenu.add(item2);

  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);
  }
}


Автор: Asal 20.3.2008, 12:04
dorogoyIV спасибо за помощь !!!  smile 

Проблема была в том что я использовал setVisible(true), а надо было show(Component invoker, int x, int y).
поменял setVisible на show и все заработало как надо. Камни преткновения рассосались  smile 

Автор: dorogoyIV 21.3.2008, 18:46
с PopupMenu заморочки постоянно.
такое ощущение, что сановцы просто игнорируют его  smile 
в шестой версии Java сделали трэй с поддержкой awt.PopupMenu  smile 

как то делал JWindow с JPopupMenu, в джаре не хочет работать - а так(вне джара) работает smile 

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