Eclipse中else if调用JOptionPane.showMessageDialog弹窗出现在IDE后方问题
问题原因
- 调用
JOptionPane.showMessageDialog时第一个参数传入了null,Swing无法为弹窗匹配归属的父窗口,弹窗没有明确的层级归属,优先级低于当前处于活跃状态的Eclipse窗口,因此被遮挡。 - 代码混合了控制台IO(
Scanner读取输入)和Swing图形组件,用户输入操作是在Eclipse的控制台面板完成,整个程序的窗口焦点始终被Eclipse占用,Swing弹窗触发时无法抢到系统焦点,自然下沉到窗口栈的后方。
解决方案
方案1:统一使用Swing交互(推荐)
放弃控制台Scanner输入,全部用Swing组件完成交互,避免两种不同的UI体系冲突:
import javax.swing.JOptionPane; public class Main { public static void main(String args[]) { String input = JOptionPane.showInputDialog("Enter measurements: "); Double c = Double.parseDouble(input); if (c>=300) { JOptionPane.showMessageDialog(null, "measurement exceeds available length"); } else if (c<300 && c>260) { JOptionPane.showMessageDialog(null, "value valid, proceed?"); } else if(c<=260){ JOptionPane.showMessageDialog(null, "measurement too short."); } else { JOptionPane.showMessageDialog(null, "enter a number."); } } }
方案2:强制弹窗置顶
如果需要保留Scanner控制台输入逻辑,可以创建一个临时置顶的父组件传递给JOptionPane,强制弹窗显示在最上层:
import java.util.Scanner; import javax.swing.JDialog; import javax.swing.JOptionPane; public class Main { public static void main(String args[]) { Scanner scanner= new Scanner(System.in); System.out.print("Enter measurements: "); Double c = scanner.nextDouble(); if (c>=300) { System.out.print("measurement exceeds available length"); } else if (c<300 && c>260) { // 创建临时置顶父窗口 JDialog dialog = new JDialog(); dialog.setAlwaysOnTop(true); JOptionPane.showMessageDialog(dialog, "value valid, proceed?"); dialog.dispose(); } else if(c<=260){ System.out.println("measurement too short."); } else { System.out.println("enter a number."); } } }
内容的提问来源于stack exchange,提问作者Uzair Baig
相关产品推荐
相关产品推荐

