2017-12-19 32 views
0

JScrollPane에서 스크롤바를 비활성화하거나 숨기고 싶지만 사용자가 마우스 휠로 위아래로 스크롤 할 수있게하십시오. verticalScrollBarPolicy (NEVER)를 사용하면 스크롤 막대가 표시되지 않으므로 Ok이지만 휠을 사용할 수 없습니다.SWING은 스크롤바를 비활성화하거나 숨기고 휠을 활성화합니까?

제안 사항? 감사합니다.

+0

[mcve]는 어디에 있습니까? 마지막 질문에서 한 명을 요청 받았습니다. – camickr

+0

@camickr MCVE는 누구에게이 문제에 대한 답을 어떻게 도울 수 있습니까? 잠재적 인 응답자는 스크롤 막대를 숨기는 동안 휠을 활성화하는 방법을 알고 있습니다. 관련성이없는 코드를 querents에 게시하는 것을 권장하지 마십시오. –

+0

@DawoodibnKareem OP가하는 일에 대해 약간의 아이디어를 갖는 것이 매우 중요하다고 주장 할 것입니다. 그 자체로는 질문에 대한 답을 제공 할 수있을뿐 아니라 다른 사람들이 일을하지 못하게하는 데 도움이된다는 것입니다 많은 경우 포스터가 "자신이 가진 것에 적합하지 않아"동의하지 않는 솔루션을 소유하고 있으며, 그것이 발생하지 않는다고 생각하지 않습니다. 그리고 OP가 질문을 두 배로 계속하기 때문에, 또 다른 문제가 있습니다. – MadProgrammer

답변

1

Based on this answer from CodeRanch, 스크롤 막대가 표시되지 않으면 스크롤이 비활성화됩니다. JScrollBarisVisible 속성을 재정 의하여 스크롤해야합니다. 당신은 Scrollable를 사용할 필요가 없습니다

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollBar; 
import javax.swing.JScrollPane; 
import javax.swing.Scrollable; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       JScrollPane scrollPane = new JScrollPane(new TestPane()); 
       JScrollBar scrollBar = new JScrollBar(JScrollBar.VERTICAL) { 

        @Override 
        public boolean isVisible() { 
         return true; 
        } 
       }; 
       // if appropriate, uncomment 
       //scrollBar.putClientProperty("JScrollBar.fastWheelScrolling", Boolean.TRUE); 
       scrollPane.setVerticalScrollBar(scrollBar); 
       scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); 
       frame.add(scrollPane); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel implements Scrollable { 

     public TestPane() { 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 800); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      FontMetrics fm = g2d.getFontMetrics(); 
      Integer lineY = null; 
      for (int yPos = fm.getAscent(); yPos < getHeight(); yPos += 30) { 
       g2d.drawString(Integer.toString(yPos), 10, yPos + fm.getAscent()); 
       if (lineY != null) { 
        g2d.drawLine(15, lineY, 15, yPos); 
       } 
       lineY = yPos + fm.getAscent(); 
      } 
     } 

     @Override 
     public Dimension getPreferredScrollableViewportSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
      return 64; 
     } 

     @Override 
     public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
      return 128; 
     } 

     @Override 
     public boolean getScrollableTracksViewportWidth() { 
      return false; 
     } 

     @Override 
     public boolean getScrollableTracksViewportHeight() { 
      return false; 
     } 

    } 

} 

, 이론을 테스트하기 위해 데모 목적으로 순수 여기에 사용됩니다. 하나 개 이상의 구성 요소에 포함 된 경우

은, 그러나, 또한 스크롤의 전반적인 속도에 영향을 미칠 수 getScrollableUnitIncrement를 호출 중지, 뭔가이 더

아를 조사해야합니다, 다른주의 사항이 있습니다 JScrollPaneMouseWheelListener 이벤트에 등록하면 스크롤 창을 알리는 메시지가 표시되지 않습니다.