【问题标题】:JscrollPane doesn't receive mousewheelevent when add it in JSPlitPane inside Matlab将 JscrollPane 添加到 Matlab 内的 JSPlitPane 中时,未收到 mousewheelevent
【发布时间】: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


【解决方案1】:

再次(避免任何打字错误)是

  1. usung Matlab 可访问的鼠标滚轮,
  2. 鼠标点击任意 JButton(在 JPanel 中)选中的 JButton
  3. 如果没有,请使用 SSCCE 形式的 Swing 和 Matlab 编辑您的问题

.

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class JScrollBarUnitIncrement {

    private JFrame f = new JFrame("");
    private JPanel panel = new JPanel() {
        private static final long serialVersionUID = 1L;

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(80, 600);
        }
    };
    private JScrollPane sPane = new JScrollPane(panel) {
        private static final long serialVersionUID = 1L;

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(100, 200);
        }
    };
    private final int increment = 8;

    public JScrollBarUnitIncrement() {
        panel.setLayout(new GridLayout(40, 1));
        for (int i = 0; i != 40; i++) {
            JButton btn = new JButton("Button 2");
            panel.add(btn);
        }
        sPane.getVerticalScrollBar().setUnitIncrement(increment);
        KeyStroke kUp = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0);
        KeyStroke kDown = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0);
        sPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(kUp, "actionWhenKeyUp");
        sPane.getActionMap().put("actionWhenKeyUp", new AbstractAction("keyUpAction") {
            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                final JScrollBar bar = sPane.getVerticalScrollBar();
                int currentValue = bar.getValue();
                bar.setValue(currentValue - increment);
            }
        });
        sPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(kDown, "actionWhenKeyDown");
        sPane.getActionMap().put("actionWhenKeyDown", new AbstractAction("keyDownAction") {
            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                final JScrollBar bar = sPane.getVerticalScrollBar();
                int currentValue = bar.getValue();
                bar.setValue(currentValue + increment);
            }
        });
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(sPane);
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JScrollBarUnitIncrement();
            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 2012-11-07
    • 1970-01-01
    • 2018-06-05
    • 2017-03-05
    • 2017-03-03
    • 1970-01-01
    • 2012-11-17
    • 2013-12-17
    相关资源
    最近更新 更多