Java Swing开发问题:程序启动后面板不可见,点击鼠标才正常显示
问题原因分析
你的代码核心问题有两个,其中第一个是导致首次运行界面空白的直接原因:
- 核心问题:
point变量未初始化,首次绘制触发空指针异常
你在theFrame类中定义了private Point point;但没有给初始值,默认是null。窗口首次加载调用centralPanel的paintComponent方法时,会执行g2.drawRect(point.x-25,point.y-25,50,50);,此时直接抛出NullPointerException,打断了Swing的绘制线程,所以所有组件都没有渲染出来。
当你点击窗口后,mouseClicked方法给point赋值了有效坐标,后续的重绘不会再抛出异常,组件就能正常显示了。 - 次要问题:字符串比较用
==而非equals
你在菜单事件监听中写的if (e.getActionCommand()=="Toggle grid")是错误的用法,==比较的是字符串对象的内存地址,不是内容,后续可能出现菜单点击无响应的问题。 - 非问题但不规范:JMenuBar放置位置错误
JFrame本身提供了setJMenuBar()方法专门放置菜单栏,不需要单独套一个JPanel放在北部区域,不符合Swing的规范用法。
修复方案
你只需要做如下修改即可解决空白窗口问题:
- 在
theFrame的构造方法中给point赋初始值,比如:
public theFrame(String title,int left,int top,int width,int height) { gridIsOn=false; myWidth=width; myHeight=height; // 新增初始化point的代码 point = new Point(100, 100); setTitle(title); // 其余原有代码不变 }
- 修正字符串比较的写法:
if ("Toggle grid".equals(e.getActionCommand())) { gridIsOn=!gridIsOn; repaint(); }
- (可选优化)把菜单栏直接设置到JFrame上,删掉没用的
upperPanel:
// 删掉upperPanel相关代码,直接在theFrame构造中添加如下代码 JMenuBar myMenuBar=new JMenuBar(); JMenu tools=new JMenu("Tools"); JMenuItem grid=new JMenuItem("Toggle grid"); grid.addActionListener(new MenuActList()); myMenuBar.add(tools); tools.add(grid); setJMenuBar(myMenuBar);
额外优化建议
添加完所有组件后调用一次revalidate()触发布局校验,保证所有组件的位置计算正确:
add(cp,BorderLayout.CENTER); revalidate();
内容的提问来源于stack exchange,提问作者4ulls
相关产品推荐
相关产品推荐

