让 JFrame 在平铺窗口管理器上浮动显示



我目前正在编写一个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 的默认对话框,例如 MessageDialogConfirmDialog等由此,您可以使用 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();
            }
        });
    }
}

最新更新