Я пытаюсь отключить JComponent
из другого класса, похожего на модальный диалог. В моем случае я вызываю диалог JavaFX от компонента Swing; более конкретно, FileChooser
. Так как, например, showOpenDialog
ожидает javafx.stage.Window
в качестве аргумента, передача JComponent
не является вариантом.Как заблокировать JComponent из другого класса?
Я попытался с помощью setEnabled(false)
и setEnabled(true)
, но это имеет странный побочный эффект: При вызове setEnabled(true)
, то JFrame
будет сведено к минимуму. Вызов setVisible(true)
решает это, но заставляет экран «мигать», потому что кадр будет исчезать на короткое время.
Проблема возникает, когда я использую CountDownLatch
, чтобы ждать возврата выбора файла, что необходимо, потому что в противном случае оно немедленно вернется, и я не смогу получить доступ к возвращаемому значению.
Вот SSCCE воспроизвести проблему:
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JFrame frame = new JFrame("Test");
JButton button = new JButton("Click me!");
JFXPanel jfxPanel = new JFXPanel();
FileChooser fileChooser = new FileChooser();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.setEnabled(false);
CountDownLatch latch = new CountDownLatch(1);
Platform.runLater(() -> {
fileChooser.showOpenDialog(null);
latch.countDown();
});
try {
latch.await();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
frame.setEnabled(true);
}
});
frame.add(button);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
});
}
Есть еще один вариант, чтобы заблокировать компонент?
Вы хотите, чтобы блокировать 'JFrame' полностью (например, не масштабирование) или просто блокировать взаимодействие с его содержание? – 3ph3r
Думаю, этого было бы достаточно. – Veluria