В этом примере открывается 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();
}
}