【发布时间】:2013-08-29 09:30:52
【问题描述】:
我在 Swing 中制作了一个简单的 GUI,其中 JScrollPane 内、JSPlitPane 内、JPanel 内、.... JFrame 内有一个大 JPanel(显示一个大 BufferedImage)。
直接从 Eclipse IDE 运行/显示我的 JFrame 时,JScrollPane 正确接收鼠标滚轮事件并在我滚动鼠标滚轮时滚动。
但是从 Matlab 运行时(我已经构建了一个 JAR),当我滚动鼠标滚轮时,JScrollPane 不会滚动。
我尝试使用一些 syso 手动添加 mousewheellistener 来调试/理解问题,如下所示:
jscrollpane.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
System.err.println("jscrollpane mouse wheel event");
}
});
jsplitpane.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
System.err.println("jsplitpane mouse wheel event");
}
});
直接从 Eclipse IDE 运行时,会显示“jscrollpane 鼠标滚轮事件”(可以)。但是当从 Matlab 运行我的 GUI 时,它会显示“jsplitpane 鼠标滚轮事件”。
我还添加了这段代码以确保我的 jscrollpane 有一个 mousewheellistener:
for (MouseWheelListener listener : jscrollpane.getMouseWheelListeners()) {
System.err.println("ONE LISTENER FOR JSCROLLPANE");
}
它显示了两次(一次用于我的 syso 侦听器,一次用于 jscrollpane 组件的内置鼠标滚轮侦听器)。
那么在 Matlab 中 JScrollPane 组件会发生什么?如何强制 JscrollPane 接收 MouseWheel 事件?
我认为 Matlab 更新了通用的 awt 掩码事件以防止 jscrollpane 捕获鼠标滚轮事件?
【问题讨论】:
-
hmmm 必须从 MouseWheelListener 消费()鼠标事件,可能有一个简单的(从未尝试过 matlab,没有尝试或使用的意图)必须测试是否不是 matlab 重量级,然后是 AWT 基础要使用(),您可以测试非常简单的将 MouseWheelListener 添加到父级(matlab),如果使用 JScrollPane 触发的事件,您将成为混合重型和轻量级(J)组件的受害者
-
我已经读到鼠标事件被提供给顶部组件,如果它没有被消耗,则提供给它的父组件。这是捕获鼠标滚轮事件的jsplitpane;这是 jscrollpane 的父级。所以......在 JScrollpane 必须得到它之前,该事件不会被消耗。这就好像jscroolpane被“禁用”了,没有收到事件,事件直接交给它的父级(jsplitpane)。
-
不知道,你想告诉我没有matlab一切正常,还是不行
-
是的,在 Matlab 之外创建我的 gui 类的实例,一切正常,因为它必须工作。但是在 Matlab 中加载类,并创建我的 Gui 类的新实例,鼠标滚轮事件没有被处理,因为它必须被处理。
标签: java swing matlab jscrollpane mousewheel