0

JScrollPane 内、JSPlitPane 内、JPanel 内、.... JFrame 内に大きな JPanel (大きな BufferedImage を表示する) を使用して、Swing で単純な GUI を作成しました。

JFrame を Eclipse IDE から直接実行/表示すると、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");
}

そして、それは 2 回表示されます (1 回は私の syso リスナー用で、もう 1 回は jscrollpane コンポーネントの組み込みの mousewheellistener 用です)。

では、Matlab では JScrollPane コンポーネントはどうなるでしょうか? JscrollPane に MouseWheel イベントを強制的に受け取るにはどうすればよいですか?

私はMatlabが一般的なawtマスクイベントを更新して、jscrollpaneがマウスホイールイベントをキャッチするのを防ぐと思いますか?

4

1 に答える 1

1

繰り返しますが(タイプミスによる間違いを避けます)、

  1. アクセシブルなMatlabのusungによるマウスホイール、
  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 に答える