0

我在 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 捕获鼠标滚轮事件?

4

1 回答 1

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();
            }
        });
    }
}
于 2013-08-29T10:50:58.143 回答