我試圖從另一個類中禁用JComponent
,類似於模態對話。就我而言,我從Swing組件中調用JavaFX對話框;更具體地爲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