2013-08-29 3 views
0

저는 JScrollPane 내부, JSPlitPane 내부, JPanel 내부, 큰 JPanel (큰 BufferedImage 표시)로 간단한 GUI를 만들었습니다. JFrame 내부.JscrollPane은 Matlab 내의 JSPlitPane에 추가 할 때 mousewheelevent를 수신하지 않습니다.

Eclipse IDE에서 JFrame을 직접 실행/표시 할 때 JScrollPane은 마우스 휠을 스크롤 할 때 마우스 휠 이벤트를 올바르게 수신하고 스크롤합니다.

그러나 Matlab (JAR 빌드)에서 실행하면 마우스 휠을 스크롤 할 때 JScrollPane이 스크롤되지 않습니다.

나는 다음과 같이/디 버브 일부 syso 수동 MouseWheelListener를 추가하여 문제를 이해하려고 노력했습니다

이클립스 IDE에서 직접 실행하는 경우가 표시되는
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"); 
    } 
}); 

"JScrollPane의 마우스 휠 이벤트를"(이것이 승인). 그러나 Matlab에서 GUI를 실행할 때 "jsplitpane 마우스 휠 이벤트"가 표시됩니다.

I했습니다 또한 내 JScrollPane의가 MouseWheelListener를 가지고 있는지 확인하기 위해이 코드 조각을 추가

for (MouseWheelListener listener : jscrollpane.getMouseWheelListeners()) { 
    System.err.println("ONE LISTENER FOR JSCROLLPANE"); 
} 

을 그리고 그것은 내장 MouseWheelListener를 두 번 (내 syso 리스너에 한 번, 한 시간이 표시되는 jscrollpane 구성 요소의).

그래서 JScrollPane 구성 요소는 Matlab에서 어떻게됩니까? JscrollPane이 MouseWheel 이벤트를 수신하도록하려면 어떻게해야합니까?

Matlab이 일반적인 awt 마스크 이벤트를 업데이트하여 mousewheel 이벤트를 잡는 jscrollpane을 방지 할 수 있다고 생각하십니까?

+0

흠 뭔가() MouseWheelListener를에서 마우스 이벤트가, 헤비급 MATLAB에없는 경우 테스트 할 수있다 (해본 적이 MATLAB하지 의도 시도하거나 사용하는) 하나의 간단한있을 수 섭취해야, 다음 AWT 기반을 소비하는(), 당신은 매우 간단한 테스트를 부모 (matlab)에 MouseWheelListener를 추가 할 수 있습니다. JScrollPane을 통해 발생하는 이벤트를 소비하는 경우 경량 (J) 구성 요소와 무거운 믹싱의 희생자입니다. – mKorbel

+0

마우스 이벤트가 주어 졌다고 읽었습니다 상위 구성 요소로 이동하여 부모에게 제공합니다. 여기에는 마우스 휠 이벤트를 잡는 jsplitpane이 있습니다. 이것은 jscrollpane의 부모입니다. 그래서 ... JScrollpane이 이벤트를 가져 오기 전에 이벤트가 소비되지 않습니다. 그것은 jscroolpane이 "disable"이고 이벤트를받지 못했고, 이벤트가 부모 (jsplitpane)에 직접 주어져있는 것과 같습니다. – Alexxx

+0

전혀 모르겠다. matlab을 사용하지 않고 모든 것이 작동하는지 여부를 알려주시겠습니까? – mKorbel

답변

1

다시 다음 스윙하여 질문을 수정하지 않을 경우 JButton의

  • 선택 (JPanel의에서) 어떤하는 JButton에 usung matlab에 accesible에 의해

    1. 마우스 휠,
    2. 마우스 클릭을하고 있습니다 (오타에서 어떤 실수를 피할 수) & Matlab in 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(); 
          } 
         }); 
        } 
    } 
    
  • 관련 문제