我的应用程序与第三方独立应用程序集成,它将在单独的线程中打开JOptionPane对话框,我正在运行该线程以关闭所有打开的对话框。所以在关闭之前我需要在对话框上写入消息。< / p>
我想要实现的示例主程序:
public static void main(String[] args)throws Exception{
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
executor.scheduleAtFixedRate(() -> {
Window[] possibleWindow = Window.getWindows();
if (possibleWindow != null && possibleWindow.length > 0) {
System.out.println("Found " + possibleWindow.length + "Window(s) " + possibleWindow[0].getClass().getSuperclass());
for (int i = possibleWindow.length - 1; i >= 0; i--) {
try {
Window window = possibleWindow[i];
//here where I need to get the dialog box message before closing it.
window.dispose();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}, 1, 1, TimeUnit.SECONDS);
JOptionPane.showMessageDialog(null, "test !!!!");
}
答案 0 :(得分:1)
如果我正确地提出了你的问题,你就会创建JOptionPane对象并给它们一个消息;以后,你想知道你给他们的信息吗?
如果是这样,一个简单的解决方案就是创建一个中心地图,如Map<JOptionPane, String>
。每次创建新的JOptionPane时,都会记住它(及其消息);清理后;您只需获取那些仍在运行的JOptionPane对象的消息。
答案 1 :(得分:0)
你需要递归地窗口的所有组件。 此解决方案适用于您的情况:
public static String getMess(Container w){
for (Component component : w.getComponents()) {
if (component instanceof JLabel) {
return ((JLabel) component).getText();
}
else if (component instanceof JTextField){
return ((JTextField) component).getText();
}
else if (component instanceof Container){
String s = getMess((Container) component);
if (!s.isEmpty()){
return s;
}
}
}
return "";
}
答案 2 :(得分:0)
这个解决方案对我有用:
if (window instanceof JDialog) {
System.out.println("text : " + ((JOptionPane)((JDialog) window).getContentPane().getComponents()[0]).getMessage());
}