Как гласит заголовок, у меня есть 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: Я сдаюсь. Я буду делать без всплывающего окна типа окна. Мне все равно было бы интересно, если бы кто-нибудь нашел решение этой проблемы.