簡體   English   中英

在Matlab的JSPlitPane中添加JscrollPane時,它沒有收到mousewheelevent

[英]JscrollPane doesn't receive mousewheelevent when add it in JSPlitPane inside Matlab

我在Swing中制作了一個簡單的GUI,在JScrollPane內,JSPlitPane內,JPanel內,.... JFrame內有一個大JPanel(顯示一個大BufferedImage)。

直接從Eclipse IDE運行/顯示JFrame時,JScrollPane正確接收mousewheel事件並在我滾動鼠標滾輪時滾動。

但是從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組件的內置mousewheellistener)。

那么在Matlab中JScrollPane組件會發生什么呢? 如何強制JscrollPane接收MouseWheel事件?

我認為Matlab更新了一般的awt掩碼事件,以防止jscrollpane捕獲鼠標滾輪事件?

再次(避免打字錯誤)

  1. 可以使用usung Matlab的mousewheel,
  2. 鼠標單擊選定的JButton中的任何JButton(在JPanel中)
  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();
            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM