我有以下Swing UI结构。
当我在蓝色JPanel中滚动鼠标滚轮时,JScrollPane不响应鼠标滚轮事件。为什么呢?
我从java doc中读到:
JScrollPane提供轻量级组件的可滚动视图。 ... 请注意,JScrollPane不支持重量级组件。
这是因为我的结构太重了?还是其他任何原因?
我不小心用鼠标中键点击了我的窗口。之后,鼠标滚轮突然为JScrollPane工作了。
这让我想到它可能与focus
有关。然后我发现下面一行:
this.setFocusableWindowState(false);
将其更改为下方后,鼠标滚轮可以正常工作。
this.setFocusableWindowState(true);
虽然javadoc说:
将窗口的可聚焦状态设置为false是标准 应用程序向AWT识别一个Window的机制 将用作浮动调色板或工具栏,因此应该是 不可聚焦的窗口。
首先,我猜是因为JDialog不处于可聚焦窗口状态,因此它无法接收事件。但实际上,鼠标点击始终有效。所以我仍然不确定根本原因。
似乎工具栏或浮动调色板无法聚焦但仍可以接收鼠标点击事件。所以我猜{strong>可能只有某些事件被setFocusableWindowState(false)
过滤。
答案 0 :(得分:2)
关于重量级的组件:意味着使用操作系统小部件的AWT组件。你使用swing JComponents,J *。 Swing组件称为轻量级,因为它们在一个大型本机窗口中模拟所有绘图和事件处理。
JPanel应该比JScrollPane大,所以一个"查看端口"可以滚动。 首选尺寸设置正确。
一般来说,我会认为每个JTextPane都在自己的JScrollPane中。
JScrollPane的功能也有所不同。
scrollPane = new JScrollPane(panel);