Как открыть JDialog, основанный на расположении мыши? - PullRequest
0 голосов
/ 17 октября 2019

В этом примере открывается JFrame с кнопкой. При нажатии кнопки открывается JDialog. XY-местоположение мыши на кнопке фиксируется и используется для открытия JDialog.

Проблема в том, что XY, зафиксированный на кнопке, правильный, но это XY относительно JFrame. Когда JDialog открыт, это делается относительно монитора.

Можно ли открыть JDialog в зависимости от местоположения XY от щелчка мыши?

import java.awt.Dialog;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;

public class JDialogInJFrame {
  private static int index;
  MouseEvent mouseXY;
  JFrame f; 

  private void display() {
    f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JButton jb = new JButton(new AbstractAction()
    {
        public void actionPerformed(ActionEvent e) 
        {
            System.out.println("actionPerformed");
          JDialog jd = new JDialog(f);
          jd.setTitle("D" + String.valueOf(++index));
          jd.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
          jd.add(new JButton());
          jd.setSize(200, 200);
          jd.setLocation(mouseXY.getX(), mouseXY.getY());
          jd.setVisible(true);
        }
    }
    );

    jb.addMouseListener(new MouseListener ()
    {

        public void mousePressed(MouseEvent e) {
            mouseXY = e;
           saySomething("Mouse pressed; # of clicks: "
                        + e.getClickCount(), e);
        }

        public void mouseReleased(MouseEvent e) {
           saySomething("Mouse released; # of clicks: "
                        + e.getClickCount(), e);
        }

        public void mouseEntered(MouseEvent e) {
           saySomething("Mouse entered", e);
        }

        public void mouseExited(MouseEvent e) {
           saySomething("Mouse exited", e);
        }

        public void mouseClicked(MouseEvent e) {
           saySomething("Mouse clicked (# of clicks: "
                        + e.getClickCount() + ")", e);
        }

        void saySomething(String eventDescription, MouseEvent e) {
            System.out.println(eventDescription + " detected on "
                            + e.getComponent().getClass().getName());
        }
    });

    f.add(jb);
    f.setSize(200, 200);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }

  public static void main(String[] args) {

    new JDialogInJFrame().display();

  }
}

1 Ответ

2 голосов
/ 17 октября 2019

Существует несколько SwingUtilities функций для преобразования координат между системой координат компонента и системой экрана. Используется как здесь. Это помогает для такого рода вещей.

    JButton component = new JButton();
    Point pt = new Point(component.getLocation());
    SwingUtilities.convertPointToScreen(pt, component);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...