
Java无边界窗口怎么去掉标题栏和边框
直接用 setUndecorated(true),但必须在 setVisible(true) 之前调用,否则抛 IllegalComponentStateException。Swing 默认窗口依赖系统装饰,一旦设为无边框,就彻底失去拖动、缩放能力——得自己实现。
常见错误是先 setVisible(true) 再 setUndecorated(true),控制台没报错但界面卡死;或者忘了调 setResizable(false),导致用户右键菜单里还能点“最大化”,窗口瞬间炸出屏幕外。
- 必须在
new JFrame()后立即调用setUndecorated(true) - 推荐搭配
setResizable(false)和setAlwaysOnTop(true),避免便签被其他窗口盖住 - 如果要支持拖动,得监听
mousePressed记下相对坐标,再在mouseDragged中算新位置并setLocation()
Java桌面便签如何保存文本到本地文件
别用 Properties 或序列化,便签内容就是纯文本,Files.write() 最轻量、最可靠。路径选用户主目录下的隐藏子目录(如 .notepad/data.txt),避免权限问题或误删。
容易踩的坑是硬编码绝对路径,比如写成 "C:\temp\note.txt",一换电脑就崩;或者用 FileWriter 不指定编码,中文全变乱码——Windows 默认 GBK,macOS/Linux 默认 UTF-8。
立即学习“Java免费学习笔记(深入)”;
- 用
System.getProperty("user.home")拼路径,例如:Paths.get(System.getProperty("user.home"), ".notepad", "note.txt") - 写入时显式指定
StandardCharsets.UTF_8,读取也一样 - 每次保存前先检查父目录是否存在,用
Files.createDirectories()创建,别指望它自动建
Java无边界窗口里怎么响应鼠标拖动
核心是记录鼠标按下时相对于窗口左上角的偏移量(offsetX, offsetY),然后在拖动事件里用当前鼠标位置减去这个偏移,得到新坐标。不能直接用 getMousePosition(),它返回的是相对于组件的坐标,且在无边框窗口里常为空。
另一个坑是监听器加错对象:如果只给 JTextArea 加拖动监听,那用户在空白处点一下就拖不动了;必须加在顶层容器(比如 JFrame.getContentPane())或一个覆盖全窗的 JPanel 上。
- 在
mousePressed里记下:offsetX = e.getX(); offsetY = e.getY(); - 在
mouseDragged里计算:int x = e.getLocationOnScreen().x - offsetX;,同理算 y - 调用
setLocation(x, y),注意别让窗口飞出屏幕顶部(y
Java便签程序启动时如何自动加载上次内容
读取文件要在 UI 显示之后做,否则 JTextArea.setText() 可能被后续布局重置;同时得包一层 try-catch,因为首次运行时文件根本不存在,Files.readAllLines() 会抛 NoSuchFileException。
别在构造函数里直接读文件并塞进 JTextArea,Swing 的 EDT(事件分发线程)还没完全准备好,偶尔会显示空内容;也不要用 Thread.sleep() 硬等,这是典型反模式。
- 用
SwingUtilities.invokeLater()包裹加载逻辑,确保在 UI 初始化完成后执行 - 捕获
IOException和其子类NoSuchFileException,失败时留空即可,不弹框不中断 - 读取后用
String.join(" ", lines)拼接,避免手动循环拼字符串
真正的难点不在代码长短,而在于无边界窗口的交互细节:拖动时的坐标换算、多屏环境下 getLocationOnScreen() 的行为差异、不同 JVM 版本对 setAlwaysOnTop() 的支持程度——这些没法靠查文档一次搞清,得在 Windows/macOS/Ubuntu 上各跑一遍才信得过。









