【问题标题】:Remove Arrows from Swing Scrollbar in JScrollPane从 JScrollPane 中的 Swing 滚动条中删除箭头
【发布时间】:2010-12-19 16:52:06
【问题描述】:

我想从 JScrollPane 的滚动条中删除滚动条箭头按钮。我该怎么做?

【问题讨论】:

    标签: java swing icons jbutton jscrollbar


    【解决方案1】:
    class NoArrowScrollBarUI extends BasicScrollBarUI {
    
    
    protected JButton createZeroButton() {
        JButton button = new JButton("zero button");
        Dimension zeroDim = new Dimension(0,0);
        button.setPreferredSize(zeroDim);
        button.setMinimumSize(zeroDim);
        button.setMaximumSize(zeroDim);
        return button;
    }
    
    @Override
    protected JButton createDecreaseButton(int orientation) {
        return createZeroButton();
    }
    
    @Override
    protected JButton createIncreaseButton(int orientation) {
        return createZeroButton();
    }
    
    
    @Override
    protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
        //own painting if needed
    }
    
    @Override
    protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
        //own painting if needed
    }
    

    }

    删除按钮为那时腾出空间。我发现让按钮归零是最简单的方法。

    【讨论】:

      【解决方案2】:

      如果您使用的是 JScrollBar 的基本版本,那么它可能正在使用 BasicScrollBarUI 进行渲染。我建议您扩展 BasicScrollBarUI 以创建自定义 UI 类(如 MyBasicScrollBarUI)。按钮是超类中的受保护变量。因此,您需要覆盖子类中的 installComponents() 方法并确保不添加按钮。请参阅下面的代码 sn-p 并按照那里的建议隐藏这些行。

      protected void installComponents(){
          switch (scrollbar.getOrientation()) {
          case JScrollBar.VERTICAL:
              incrButton = createIncreaseButton(SOUTH);
              decrButton = createDecreaseButton(NORTH);
              break;
      
          case JScrollBar.HORIZONTAL:
              if (scrollbar.getComponentOrientation().isLeftToRight()) {    
                  incrButton = createIncreaseButton(EAST);
                  decrButton = createDecreaseButton(WEST);
              } else {
                  incrButton = createIncreaseButton(WEST);
                  decrButton = createDecreaseButton(EAST);
              }
              break;
          }
          scrollbar.add(incrButton); // Comment out this line to hide arrow
          scrollbar.add(decrButton); // Comment out this line to hide arrow
          // Force the children's enabled state to be updated.
      scrollbar.setEnabled(scrollbar.isEnabled());
      }
      

      然后,在初始化 JScrollBar 后,您可以在代码中调用 setUI() 并传入 MyBasicScrollBarUI 类的实例。

      注意:我自己没有尝试过,但从代码看来它可以工作。

      【讨论】:

      • 您可能不应该扩展“基本”用户界面。如果这样做,那么您将丢失所有 LAF 自定义项。因此,您可能应该扩展 MetalScrollBarUI,或者任何用于 LAF 的 UI。
      • @camickr:同意这一点。扩展基本 UI 只是说明可能的解决方案的最简单方法。
      • @Thimmayya 我尝试了代码,虽然箭头图标消失了,但按钮仍然存在。我刚刚编辑了我的问题以指定删除按钮。不过感谢您的想法。
      • 代码只是隐藏了按钮。按钮的占位符空间仍然存在并且保持空置。它没有被滚动条占据。
      【解决方案3】:

      这不是最优雅的方式......但对我有用

      JScrollBar jsb = getHorizontalScrollBar();
              for(Component c : jsb.getComponents()) {
                  jsb.remove(c);
              }
      

      【讨论】:

        【解决方案4】:

        我就是这样走的。

        1. 设置要隐藏的滚动条的滚动条策略为never
        2. MouseWheelListener 模仿这种行为

        这个方法:

        • 只需很少的代码行即可快速实现。
        • 保留L&F 的优势。
        • 同时删除按钮和栏。

        以下是用于删除verticall scroll bar示例代码。

        JScrollPane myScrollPane = new JScrollPane();
        
        //remove the scroll bar you don't want
        myScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
        
        JTextPane myJTextArea = new JTextPane();
        
        //myScrollPane.setViewportView(myJTextArea);
        
        myScrollPane.addMouseWheelListener(new MouseWheelListener() {
        
           //this will mimick the behavior of scrolling
           public void mouseWheelMoved(MouseWheelEvent e) {
                    JScrollBar scrollBar =  myScrollPane.getVerticalScrollBar();
                    //capturing previous value
                    int previousValue = scrollBar.getValue();
        
                    int addAmount;
        
                    //decide where the wheel scrolled
                    //depending on how fast you want to scroll
                    //you can chane the addAmount to something greater or lesser
        
                    if(e.getWheelRotation()>0) {
                        addAmount = 2;
                    }else {
                        addAmount = -2;
                    }
        
                    //set the new value 
                    scrollBar.setValue(previousValue + addAmount);
                }
            });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-16
          • 1970-01-01
          • 1970-01-01
          • 2017-07-10
          • 1970-01-01
          • 1970-01-01
          • 2016-09-30
          相关资源
          最近更新 更多