简介
使用弹框需求时,需要用到Dialog。Swing原生的为JDialog类,如果你在开发Idea插件,推荐使用DialogWrapper。
DialogWrapper
开发Idea插件优先使用继承DialogWrapper的方式,它比Swing的JDialog多了许多特性:
- 按钮布局(跟随操作系统习惯决定Ok / Cancel的位置,以及macOS特有的Help按钮)
- 上下文帮助
- 记住Dialog的大小
- 一些校验或快捷键、不再询问等checkbox特性。
使用方法
继承自DialogWrapper后,重写createCenterPanel方法,返回Dialog内容去需要展示的内容。使用show()方法显示Dialog。
// SampleDialog.class
public class SampleDialog extends DialogWrapper {
public SampleDialog () {
super(true); // use current window as parent
setTitle("Test DialogWrapper");
init();
}
@Nullable
@Override
protected JComponent createCenterPanel() {
JPanel dialogPanel = new JPanel(new BorderLayout());
JLabel label = new JLabel("Testing");
label.setPreferredSize(new Dimension(100, 100));
dialogPanel.add(label, BorderLayout.CENTER);
return dialogPanel;
}
}
// Test.java
Button testButton = new JButton();
testButton.addActionListener(actionEvent -> {
if (new SampleDialogWrapper().showAndGet()) {
// user pressed OK
}
});
// 直接展示窗口
new SampleDialog().show();
监听Ok / Cancel事件、个性化窗口
重写createActions方法,可以个性化Dialog要展示的按钮。重写doOKAction/doCancelAction可以在Ok/Cancel按钮被点击后执行自己的逻辑。构造器中可以设置窗口是否为模态、窗口标题、按钮的展示文字等属性。
public class SampleDialog extends DialogWrapper {
public SampleDialog (@Nullable Project project) {
super(project);
setTitle("Test DialogWrapper");
// 设置为非模态窗口
setModal(false);
// 修改Ok按钮的展示文本为“提交”
setOKButtonText("提交");
init();
}
// 定义要展示的按钮
@Override
protected Action @NotNull [] createActions() {
// Action helpAction = getHelpAction();
// return helpAction == myHelpAction && getHelpId() == null ?
// new Action[]{getOKAction(), getCancelAction()} :
// new Action[]{getOKAction(), getCancelAction(), helpAction};
return new Action[] { getOKAction() };
}
@Override
protected void doOKAction() {
// 自己的逻辑
...
// 调用父类的doOKAction方法关闭弹窗
super.doOKAction();
}
@Override
public void doCancelAction() {
super.doCancelAction();
}
}
修改Dialog展示的位置为某个JButton的左上角
获取按钮在屏幕中的坐标后,坐标对应减去窗口的高度和宽度,就可以达到显示在按钮左上方的效果。
public class SampleDialog extends DialogWrapper {
// btnLocation可以通过构造器传入
// Point btnLocation = button.getLocationOnScreen();
@Override
public void show() {
int x = btnLocation.x - getPreferredSize().width;
int y = btnLocation.y - getPreferredSize().height;
setLocation(x, y);
super.show();
}
}
Swing JDialog
Swing Dialog比较简单,直接new一个JDialog后,往contentPane上添加要展示的内容,调用setVisible(true)方法就可以展示弹窗了。
boolean modal = false;
JDialog dialog = new JDialog(frame, "Demo Dialog", modal);
// 不展示标题栏
// dialog.setUndecorated(true);
// 添加要显示的Component到dialog中
dialog.getContentPane().add(panel);
dialog.pack();
// 设置窗口的宽高
dialog.setPreferredSize(new Dimension(width, height));
// 显示窗口
dialog.setLocation(x, y);
dialog.setVisible(true);
// 关闭窗口
dialog.dispose()
参考文献
https://plugins.jetbrains.com/docs/intellij/dialog-wrapper.html#usage