2013-08-16 6 views
0

JScrollPane 안에 JTextPane의 배열이 있습니다. 내가 언급 한 모든 컴포넌트는 JScrollPane 내부의 JPanel 내부에있다. 프로그램 시작시더 많은 논리적 스크롤 막대로 자바 스크롤

User interface picture

의 JTextPanes 아무도 텍스트를 가지고, 그래서 그들을 위해 스크롤바가 표시되지 않습니다. JPanel에 많은 구성 요소가 있기 때문에 JPanel의 스크롤 막대가 표시됩니다.

커서가 JTextPane 중 하나 위에 있고 스크롤하려고하면 컴퓨터가 JTextPane의 스크롤 막대로 스크롤하려고한다고 생각하기 때문에 아무런 문제가 발생하지 않습니다. 내가 원하는 것은 컴퓨터가 JPanel의 스크롤바로 스크롤하려고한다는 것을 깨닫는 것이다. 이 일을 수행 할 수있는 방법이 있습니까?

감사합니다.

편집 :

당신은 (이 JFrame의 확장 클래스의 생성자입니다 - 좋은 코딩 습관의 많은 무시에 대한 사과를) 현제 코드로 한 유사한 UI를 생산할 수 :

public JFrameTest() { 
    JPanel panel = new JPanel(new GridLayout(10 , 10 , 10 , 10)); 
    for (int i = 0 ; i < 10 ; i ++) { 
     for (int j = 0 ; j < 10 ; j ++) { 
      JScrollPane paneToAdd = new JScrollPane(new JTextPane()) { 
       /** 
       * 
       */ 
       private static final long serialVersionUID = 1L; 

       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(100 , 100); 
       } 
      }; 
      panel.add(paneToAdd); 
     } 
    } 
    add(new JScrollPane(panel)); 

    setSize(700 , 500); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 
+0

텍스트 영역에 텍스트가 있고 스크롤 막대가 표시되면 어떻게됩니까? – MadProgrammer

+0

스크롤 막대가 표시되면 텍스트 영역을 스크롤하고 스크롤 막대가없는 경우 JPanel을 스크롤합니다. (즉 스크롤링을하고 갑자기 멈추는) 문제가 있다는 것을 알고 있습니다. 그러나이 두 번째 상황이 더 좋을 것이라고 생각합니다. – user2570465

+0

@MadProgrammer - 죄송합니다. 이전 의견에 알림을 추가하는 것을 잊었습니다. 구성 요소 수신기를 사용하여 JTextPane의 크기를 조정할 때이를 감지하는 방법을 찾았지만 JTextPane의 스크롤 막대가 "존재하지 않는"상태인지 여부를 알 수 없습니다. 그런 방법이 있다면, 구성 요소가 너무 커지면 스크롤바를 "추가"할 수 있다고 생각합니다. – user2570465

답변

2

다음 코드는 Mouse Wheel Controller에서 빠른 해킹으로 간주되었습니다.

기본적으로 텍스트 영역이 포함 된 스크롤 창에 대한 MouseWheelEvent를 가로 챕니다. 스크롤 바가 가시 인 경우, 이벤트를 같은 스크롤 구획에 재 표시합니다. 그렇지 않은 경우, 부모의 scrollPane를 찾아 이벤트를 그 스크롤 구획에 dispatch합니다.

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MouseWheelToParent implements MouseWheelListener 
{ 
    private JScrollPane scrollPane; 
    private MouseWheelListener[] realListeners; 

    public MouseWheelToParent(JScrollPane scrollPane) 
    { 
     this.scrollPane = scrollPane; 
     install(); 
    } 

    public void install() 
    { 
     if (realListeners != null) return; 

     // Keep track of original listeners so we can use them to 
     // redispatch an altered MouseWheelEvent 

     realListeners = scrollPane.getMouseWheelListeners(); 

     for (MouseWheelListener mwl : realListeners) 
     { 
      scrollPane.removeMouseWheelListener(mwl); 
     } 

     // Intercept events so they can be redispatched 

     scrollPane.addMouseWheelListener(this); 
    } 

    /** 
    * Remove the class as the default listener and reinstall the original 
    * listeners. 
    */ 
    public void uninstall() 
    { 
     if (realListeners == null) return; 

     // Remove this class as the default listener 

     scrollPane.removeMouseWheelListener(this); 

     // Install the default listeners 

     for (MouseWheelListener mwl : realListeners) 
     { 
      scrollPane.addMouseWheelListener(mwl); 
     } 

     realListeners = null; 
    } 

// Implement MouseWheelListener interface 

    /** 
    * Redispatch a MouseWheelEvent to the real MouseWheelListeners 
    */ 
    public void mouseWheelMoved(MouseWheelEvent e) 
    { 
     JScrollPane scrollPane = (JScrollPane)e.getComponent(); 

     if (scrollPane.getVerticalScrollBar().isVisible()) 
     { 
      // Redispatch the event to original MouseWheelListener 

      for (MouseWheelListener mwl : realListeners) 
      { 
       mwl.mouseWheelMoved(e); 
      } 
     } 
     else 
     { 
      dispatchToParent(e, scrollPane); 
      return; 
     } 
    } 

    private void dispatchToParent(MouseWheelEvent e, JScrollPane scrollPane) 
    { 
     Component ancestor = SwingUtilities.getAncestorOfClass(JScrollPane.class, scrollPane); 

     MouseWheelEvent mwe = new MouseWheelEvent(
      ancestor, 
      e.getID(), 
      e.getWhen(), 
      e.getModifiers(), 
      e.getX(), 
      e.getY(), 
      e.getXOnScreen(), 
      e.getYOnScreen(), 
      e.getClickCount(), 
      e.isPopupTrigger(), 
      e.getScrollType(), 
      e.getScrollAmount(), 
      e.getWheelRotation()); 

     ancestor.dispatchEvent(mwe); 
    } 

    private static void createAndShowUI() 
    { 
     JPanel panel = new JPanel(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.insets = new Insets(10, 10, 10, 10); 

     for (int y = 0; y < 10; y++) 
     { 
      for (int x = 0; x < 5; x++) 
      { 
       gbc.gridx = x; 
       gbc.gridy = y; 
       JTextArea textArea = new JTextArea(5, 20); 
       JScrollPane scrollPane = new JScrollPane(textArea); 
       scrollPane.setMinimumSize(scrollPane.getPreferredSize()); 
       new MouseWheelToParent(scrollPane); 
       panel.add(scrollPane, gbc); 
      } 
     } 
     JFrame frame = new JFrame("TextAreaSSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(panel)); 
     frame.setSize(400, 400); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+0

예 ................................... – mKorbel

+0

지금 내가 왜 그런 이벤트를 소비하는지에 대한 질문입니다. :-) – mKorbel