Я пишу приложение на Java (я признаю, что я начинающий Java-программист, но у меня есть опыт в других) и мне нужно иметь возможность явно задавать свойства окна X11.В частности, мне нужно иметь возможность установить свойство _NET_WM_STATE, чтобы менеджер окон знал, что дочернее окно является модальным.
Определение этого свойства можно увидеть здесь: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html#id2578152
Это приложение имеет для написания на Java и будет работать исключительно на платформе Linux / X11поэтому переносимость даже не должна рассматриваться.При работе на стандартном ПК с Ubuntu модальность окна корректно обрабатывается.
Диспетчер окон, работающий на платформе, на которой ожидается запуск этого приложения, выполняет действия, выходящие за рамки обычной модальности, и ожидает установки свойства окна _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);
Есть идеи?