【问题标题】:Getting a JFrame to display floating on tiling window managers让 JFrame 在平铺窗口管理器上显示浮动
【发布时间】:2019-08-05 00:52:54
【问题描述】:

我目前正在编写一个 JVM Swing 应用程序,其中主窗口应该只显示为一个固定大小的对话框。在平铺窗口管理器(在我的情况下为 i3-wm)上开发它,将其作为平铺窗口处理。我希望它变成浮动的。

在其他编程语言/窗口框架中,这是通过为窗口设置“Dialog”标志来完成的,它告诉窗口管理器这个窗口是一个对话框。不幸的是,swing 似乎没有这样的选择。我也尝试使用 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)

【问题讨论】:

  • 只是一个随机猜测:用Window.POPUP 调用setType。目前无法测试。
  • 虽然弹出窗口使窗口浮动,但它也删除了窗口装饰。此外,它消除了我聚焦窗口的能力。 POPUP 似乎更多地用于上下文菜单之类的东西

标签: java scala swing


【解决方案1】:

我最近遇到了类似的问题(我也在使用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();
            }
        });
    }
}

【讨论】:

  • 直到现在我才真正看到这个,我稍后会检查它。但从我看来,这看起来很有希望!
  • 自从我发表此评论后,我发现在 JavaFX 中可以通过一行来实现; stage.initStyle(StageStyle.UTILITY)。尝试在您的 JFrame 上调用 setType(Type.UTILITY) 而不是我上面的答案(我自己还没有尝试过,所以不确定它是否以相同的方式工作)。让我知道它是如何工作的。 :)
猜你喜欢
  • 2012-02-08
  • 2012-08-16
  • 2020-09-06
  • 2023-01-07
  • 2016-06-20
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多