【发布时间】:2015-04-19 16:40:55
【问题描述】:
我正在尝试禁用另一个类的JComponent,类似于模态对话。就我而言,我正在从 Swing 组件调用 JavaFX 对话;更具体地说是FileChooser。例如,因为showOpenDialog 需要javafx.stage.Window 作为参数,所以传递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(例如不缩放)还是仅仅阻止与其内容的交互? -
我认为后者就足够了。
标签: java swing javafx jcomponent filechooser