gpt4 book ai didi

java - 将 JscrollPane 添加到 Matlab 内的 JSPlitPane 中时,JscrollPane 不会收到 mousewheelevent

转载 作者:行者123 更新时间:2023-12-01 14:11:21 27 4
gpt4 key购买 nike

我在 Swing 中制作了一个简单的 GUI,其中在 JScrollPane 内、JSPlitPane 内、JPanel 内、....在 JFrame 内有一个大 JPanel(显示大 BufferedImage)。

直接从 Eclipse IDE 运行/显示 JFrame 时,JScrollPane 正确接收鼠标滚轮事件并在我滚动鼠标滚轮时滚动。

但是当从 Matlab 运行时(我已经构建了一个 JAR),当我滚动鼠标滚轮时,JScrollPane 不会滚动。

我尝试使用一些系统手动添加 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. 使用 Matlab 访问鼠标滚轮,
  2. 鼠标单击任何 JButton(在 JPanel 中)选定的 JButton
  3. 如果没有,请使用 Swing 和 Matlab 以 SSCCE 形式编辑您的问题

.

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();
}
});
}
}

关于java - 将 JscrollPane 添加到 Matlab 内的 JSPlitPane 中时,JscrollPane 不会收到 mousewheelevent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18507146/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com