IntelliJ IDEA插件开发:JDialog如何在IDE窗口居中显示?
如何让IntelliJ插件中的JDialog在IDE窗口居中显示?
我正在开发IntelliJ插件,但搞忘了怎么让新建的JDialog在IntelliJ窗口前居中显示。要求打开新JDialog时,初始位置在IDE窗口居中,哪怕切换显示器也能生效。目前我调用setLocationRelativeTo(null);,但它总是在主屏幕打开,而不是IDE窗口内。我还尝试过自己计算坐标:
Point parentPoint = getParent().getLocation(); Dimension parentDimension = getParent().getSize(); Dimension dialogDimension = getSize(); int x = (int) (parentPoint.getX() + (parentDimension.getWidth() - dialogDimension.getWidth()) / 2); int y = (int) (parentPoint.getY() + (parentDimension.getHeight() - dialogDimension.getHeight()) / 2); setLocation(x, y);
但它总是显示在主屏幕的左上角,不是IDE所在的位置。有人知道我漏了什么吗?
嗨,这个问题我开发IntelliJ插件时也踩过坑!普通Swing的setLocationRelativeTo(null)或者直接用getParent()拿父组件的方法在IntelliJ的UI环境里不好使,因为IDE的窗口管理有自己的一套机制,普通的Swing父组件不一定能正确指向IDE的主窗口。
你得用IntelliJ Platform提供的专属API来获取正确的父窗口,再设置对话框位置,这里有两种靠谱的实现方式:
方式一:用WindowManager获取IDE主窗口
直接拿到IDE的主窗口作为对话框的父容器,再设置相对位置:
import com.intellij.openapi.wm.WindowManager; import com.intellij.openapi.project.Project; import javax.swing.*; import java.awt.*; // 插件开发中通常能获取到Project实例,比如从Action中拿到 Project project = ...; Window ideMainWindow = WindowManager.getInstance().getFrame(project); JDialog dialog = new JDialog(ideMainWindow); // 先初始化对话框内容和大小,比如用pack()或者直接setSize dialog.pack(); // 设置相对IDE主窗口居中 dialog.setLocationRelativeTo(ideMainWindow); dialog.setVisible(true);
方式二:用DialogUtil工具类(更推荐)
IntelliJ提供了专门处理对话框布局的工具类,能更好适配多显示器、多IDE窗口的场景:
import com.intellij.openapi.ui.DialogUtil; import com.intellij.openapi.project.Project; import javax.swing.*; Project project = ...; JDialog dialog = new JDialog(); dialog.setSize(400, 300); // 让对话框相对于当前IDE窗口居中 DialogUtil.centerDialog(project, dialog); dialog.setVisible(true);
为什么之前的方法失效?
setLocationRelativeTo(null)是Swing的默认行为,只会把对话框放在主屏幕中心,和IDE窗口位置无关;- 你之前用
getParent()拿到的可能只是插件内部的某个子组件,它的坐标是相对父容器的局部坐标,不是屏幕全局坐标,所以计算出来的位置完全不对。
用上面的方法,不管IDE在哪个显示器、窗口怎么缩放,对话框都会精准居中在IDE窗口前面,亲测有效!
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

