在Java中设置X11窗口属性

时间:2012-02-02 15:50:53

标签: java x11

我正在用Java编写应用程序(我承认我是Java程序员的新手,但在其他人中经验丰富)并且需要能够明确地设置X11窗口属性。具体来说,我需要能够设置_NET_WM_STATE属性,让窗口管理器知道子窗口是模态的。

此属性的定义可以在这里看到: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html#id2578152

此应用程序具有以Java编写,并且将仅在Linux / X11平台上运行,因此甚至不必考虑可移植性。在标准的Ubuntu PC上运行时,窗口的模态得到了妥善处理。

在预期运行此应用程序的平台上运行的窗口管理器执行超出正常模态的操作,并期望设置_NET_WM_STATE窗口属性。

从我的研究看来,Java似乎不想设置这些属性。我猜这是因为它可以处理Java框架中的模态,以便它可以跨平台使用相同的模式。

我已经使用xwininfo和xprop来查看Java在子窗口上设置的模态与非模态时的类型。看起来X11窗口属性中基本上没有任何东西在两种类型的窗口之间是不同的。

以下是一些如何创建子窗口的示例代码:

public class ChildDialog extends JDialog {

    static final long serialVersionUID = 2;

    public ChildDialog(JFrame frame, String title, boolean modal) {
        super(frame, title, modal);

        JPanel dgrid = new JPanel();
        dgrid.setLayout(new BoxLayout(dgrid, BoxLayout.Y_AXIS));
        dgrid.setBorder(BorderFactory.createLineBorder(Color.red, 3));
        JLabel label = new JLabel(title);
        JTextArea desc = new JTextArea("This is a child window.");
        desc.setBackground(label.getBackground());

        JButton close = new JButton("Close");
        close.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });

        dgrid.add(label);
        dgrid.add(desc);
        dgrid.add(close);

        this.setSize(300, 200);
        this.add(dgrid);
        this.setVisible(true);
    }
}

然后在单击主窗口上的按钮时实例化此类。像这样:

    JButton spawnChild = new JButton("Child Window");
    spawnChild.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            new ChildDialog(getSelf(), "Child Window", false);
        }
    });
    bgrid.add(spawnChild);

    JButton spawnModalChild = new JButton("Child Window (Modal)");
    spawnModalChild.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            new ChildDialog(getSelf(), "Child Window (Modal)", true);
        }
    });
    bgrid.add(spawnModalChild);

有什么想法吗?

0 个答案:

没有答案