You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的规范用法。
修复方案

你只需要做如下修改即可解决空白窗口问题:

  1. 在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);
    // 其余原有代码不变
}
  1. 修正字符串比较的写法:
if ("Toggle grid".equals(e.getActionCommand())) {
    gridIsOn=!gridIsOn;
    repaint();
}
  1. (可选优化)把菜单栏直接设置到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:09:03