JDialog on Linux: Компоненты кликабельны, но невидимы, когда Type - Type.POPUP - PullRequest
2 голосов
/ 10 февраля 2020

Как гласит заголовок, у меня есть JDialog с невидимыми, но интерактивными компонентами. Смотрите SSCCE ниже. Это ведет себя правильно (то есть кнопка «закрыть меня» видна) на Windows с oracle jdk1.8.0_201. Проблема воспроизводима в Debian 10 с openbox с использованием oracle jdk1.8.0_201.

Когда возникает проблема, JDialog появляется, но полностью серый. Однако эта кнопка активна и закрывает диалоговое окно, как и ожидалось.

Проблема, похоже, исчезает go, когда я не устанавливаю тип «POPUP», и вероятность ее возникновения меньше (изменяющиеся частоты появления) с другими изменениями, прокомментированными в примере кода. Я хотел бы сохранить тип POPUP, потому что его установка решала другие проблемы, от которых сложно избавиться в контексте реального приложения.

Что я делаю не так?

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;

public class LockPane extends JDialog {

    public LockPane(JFrame parentFrame, JPanel componentToShow, Dimension paneSize) {
        super(parentFrame, true);
        setType(Type.POPUP);  // removing this seems to fix the issue. but why?
        setUndecorated(true); // removing this seems to make the issue less likely to occur but does not fix it completely
        setSize(paneSize);    // removing this seems to make the issue less likely to occur but does not fix it completely
        setPreferredSize(paneSize);
        setMaximumSize(paneSize);   // removing this seems to make the issue less likely to occur but does not fix it completely
        setLayout(new GridLayout(1, 1));
        add(componentToShow);
        setAlwaysOnTop(true);
        pack();
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Lockpane Demo");
        frame.setLayout(new BorderLayout());
        JButton button = new JButton("click me to demonstrate the problem");
        button.setPreferredSize(new Dimension(400, 400));
        frame.add(button);
        frame.pack();
        button.addActionListener(e -> {
            JButton closeButton = new JButton("Close me");
            JPanel componentToShow = new JPanel(new BorderLayout());
            componentToShow.setSize(new Dimension(200, 200));
            LockPane lockPane = new LockPane(frame, componentToShow, new Dimension(200, 200));
            componentToShow.add(closeButton, BorderLayout.CENTER);
            lockPane.add(componentToShow);
            closeButton.addActionListener(e1 -> {
                System.out.println("lock pane button was clicked");
                lockPane.setVisible(false);
            });
            lockPane.setVisible(true);
        });
        frame.setVisible(true);
    }
}

РЕДАКТИРОВАТЬ: Я проверил это с openjdk-11 - не воспроизводится там! Затем я проверил с принятие topenjdk jdk8u242-b08, и проблема возникла снова. Неужели это может быть ошибка в Java 8?

EDIT2: я тестировал это с использованием accepttopenjdk jdk8u242-b08 на Debian 10 с Cinnamon Desktop. Та же проблема. Поэтому я не думаю, что это связано с рабочим столом.

EDIT3: Я сдаюсь. Я буду делать без всплывающего окна типа окна. Мне все равно было бы интересно, если бы кто-нибудь нашел решение этой проблемы.

...