[英]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捕獲鼠標滾輪事件?
再次(避免打字錯誤)
。
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.