我目前正在编写一个JVM Swing应用程序,其中主窗口应该只显示为固定大小的对话框。在平铺窗口管理器(在我的例子中为 i3-wm(上开发它,将其作为平铺窗口处理。我希望它变得漂浮。
在其他编程语言/窗口框架中,这是通过为窗口设置"Dialog"标志来完成的,该标志告诉窗口管理器此窗口是一个对话框。不幸的是,秋千似乎没有这样的选择。我也尝试使用JDialog(有效地作为JFrame的直接替代品(,但也没有运气。
进一步的研究揭示了JFrame.setResizable
的功能。传递false
导致窗口正确显示为浮动,但在一瞬间立即关闭。在这种情况下,不会调用窗口关闭处理程序。这是我最接近成功的一次
有问题的代码(scala(是
val jframe = new JFrame()
val size = new Dimension(310, 100)
jframe.setMinimumSize(size)
jframe.setMaximumSize(size)
jframe.setPreferredSize(size)
val layout = new GridLayout(0, 1)
jframe.setLayout(layout)
jframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
// snip (code to add components to the JFrame)
jframe.pack()
jframe.setVisible(true)
我最近遇到了类似的问题(我也在使用i3-wm
(。我设法使用JDialogs
创建了模仿您正在寻找的东西的东西。请注意,我不熟悉scala,所以我的解决方案是用Java编写的。尽管如此,我希望这会对您有所帮助。
您需要使用所需的设置创建一个JOptionPane
- 我假设,没有图标和组件伴随 JOptionPane
的默认对话框,例如 MessageDialog
、ConfirmDialog
等由此,您可以使用 createDialog
方法从JOptionPane
对象创建新的JDialog
对象。
然后,您可以使用应用程序中所需的布局和组件自定义和添加JPanel
。窗口的大小应通过JDialog
对象进行设置。
请记住在关闭对话框时释放对话框。此外,一旦对话框关闭,应用程序就不会为我退出,因此我添加了一个在关闭时调用System.exit(0)
的侦听器。
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class CustomDialog {
public CustomDialog() {
JPanel panel = new JPanel();
JDialog dialog;
// add components to JPanel..
// create option pane with desired settings
JOptionPane optPane = new JOptionPane(
"",
JOptionPane.INFORMATION_MESSAGE,
JOptionPane.DEFAULT_OPTION,
new Icon() {
@Override
public void paintIcon(Component component, Graphics graphics, int i, int i1) {}
@Override
public int getIconWidth() {return 0;}
@Override
public int getIconHeight() {return 0;}
},
new Object[]{},
null
);
dialog = optPane.createDialog(new Frame(), title);
dialog.setPreferredSize(new Dimension(width, height));
dialog.add(panel);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
System.exit(0);
}
});
dialog.pack();
dialog.show();
}
}
启动对话框可以这样完成
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new CustomDialog();
}
});
}
}