これは、要素を別の要素に対して相対的に配置する方法を示す小さなスニペットです。ボタンの下にポップアップ メニューが表示され、その左側に JDialog が表示されます。サブ画面がメイン画面の右側にあるマルチスクリーン環境でテストしました。
また、getPreferredSize() の代わりに、getSize()、getWidth()、および getHeight() を使用してください。getSize()、getWidth、および getHeight は、コンポーネントの実際のサイズを返しますが、getPreferredSize() は、コンポーネントが必要とするものを LayoutManager に指示するだけです。
このメソッドを使用する場合はJPopupMenu.show()
、呼び出し元コンポーネントを基準とした座標とサイズを使用してください。
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
public class Test2 {
public static void main(String[] args) {
final JFrame frame = new JFrame();
final JButton button = new JButton("Hello");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(new JMenuItem("Some test"));
System.err.println(button.getLocationOnScreen());
popupMenu.show(button, 0, button.getHeight());
JDialog dialog = new JDialog(frame);
dialog.setSize(100, 30);
Point locationOnScreen = button.getLocationOnScreen();
locationOnScreen.x += button.getWidth();
dialog.setLocation(locationOnScreen);
dialog.setVisible(true);
}
});
frame.addComponentListener(new ComponentListener() {
@Override
public void componentShown(ComponentEvent e) {
}
@Override
public void componentResized(ComponentEvent e) {
info(button);
}
private void info(final JButton button) {
if (button.isShowing()) {
System.err.println(button.getLocationOnScreen());
System.err.println(button.getGraphicsConfiguration().getBounds());
}
}
@Override
public void componentMoved(ComponentEvent e) {
info(button);
}
@Override
public void componentHidden(ComponentEvent e) {
}
});
button.setPreferredSize(new Dimension(200, 60));
frame.add(button);
frame.pack();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
}