【问题标题】:Custom Scrollbar in JScrollpane//Java SwingJScrollpane//Java Swing中的自定义滚动条
【发布时间】:2014-01-08 10:11:17
【问题描述】:

我制作了自己的 ScrollbarUI,它与 JScrollbar 完美配合。问题是我必须将此滚动条与 JPanel 连接以滚动它。我已经尝试过使用 JScrollPane,但是当我尝试接近垂直滚动条时它不会响应。我尝试更改一些简单的内容,例如光标、宽度、高度、背景,以测试 UI 是否存在问题,但这也不起作用。

    JPanel panel_1 = new JPanel();
    JScrollPane scrollpane = new JScrollPane(panel_1);
    scrollpane.setBorder(null);
    scrollpane.getVerticalScrollBar().setUI(new MyScrollbarUI());

    JTextArea txtrLorem = new JTextArea();
    txtrLorem.setPreferredSize(new Dimension(400, 1500));
    txtrLorem.setMaximumSize(new Dimension(400, 2147483647));
    txtrLorem.setText("Lorem ipsum...");
    panel_1.add(txtrLorem);

    scrollpane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    scrollpane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    GridBagConstraints gbc_panel_1 = new GridBagConstraints();
    gbc_panel_1.gridwidth = 5;
    gbc_panel_1.insets = new Insets(0, 0, 0, 5);
    gbc_panel_1.fill = GridBagConstraints.BOTH;
    gbc_panel_1.gridx = 1;
    gbc_panel_1.gridy = 4;
    add(scrollpane, gbc_panel_1);

    JScrollBar scrollBar = new JScrollBar();
    scrollBar.setPreferredSize(new Dimension(20, 96));
    scrollBar.setMinimumSize(new Dimension(20, 5));
    scrollBar.setMaximumSize(new Dimension(20, 32767));
    scrollBar.setUI(new MyScrollbarUI());
    GridBagConstraints gbc_scrollBar = new GridBagConstraints();
    gbc_scrollBar.fill = GridBagConstraints.VERTICAL;
    gbc_scrollBar.insets = new Insets(0, 0, 0, 5);
    gbc_scrollBar.gridx = 6;
    gbc_scrollBar.gridy = 4;
    add(scrollBar, gbc_scrollBar);

JScrollBar 有正确的设计,但 JScrollPane 的 Scrollbar 没有。 这是用户界面:

公共类 MyScrollbarUI 扩展 BasicScrollBarUI {

    @Override
    protected JButton createDecreaseButton(int orientation) {
        JButton btnL = new JButton("");
        btnL.setPressedIcon(new ImageIcon(KFO_baender_bracketsetz_einzel.class.getResource("/gui/icons/top_active.png")));
        btnL.setBorderPainted(false);
        btnL.setIcon(new ImageIcon(KFO_baender_bracketsetz_einzel.class.getResource("/gui/icons/top_on.png")));
        btnL.setRolloverIcon(new ImageIcon(KFO_baender_bracketsetz_einzel.class.getResource("/gui/icons/top.png")));
        btnL.setRolloverEnabled(true);
        return btnL;
    }

    @Override
    protected JButton createIncreaseButton(int orientation) {
        JButton btnL = new JButton("");
        btnL.setPressedIcon(new ImageIcon(KFO_baender_bracketsetz_einzel.class.getResource("/gui/icons/down_active.png")));
        btnL.setBorderPainted(false);
        btnL.setIcon(new ImageIcon(KFO_baender_bracketsetz_einzel.class.getResource("/gui/icons/down_on.png")));
        btnL.setRolloverIcon(new ImageIcon(KFO_baender_bracketsetz_einzel.class.getResource("/gui/icons/down.png")));
        btnL.setRolloverEnabled(true);
        return btnL;
    }

    @Override
    protected void paintDecreaseHighlight(Graphics g)
    {
    Insets insets = scrollbar.getInsets();
    Rectangle thumbR = getThumbBounds();
    g.setColor(new Color(137,144,144));

    if (scrollbar.getOrientation() == JScrollBar.VERTICAL) {
        int x = insets.left+decrButton.getWidth()/2-2;
        int y = decrButton.getY() + decrButton.getHeight();
        int w = 4;
        int h = thumbR.y - y;
        g.fillRect(x, y, w, h);
    } 
    else    {
        int x, w;
        if (scrollbar.getComponentOrientation().isLeftToRight()) {
        x = decrButton.getX() + decrButton.getWidth();
        w = thumbR.x - x;
        } else {
        x = thumbR.x + thumbR.width;
        w = decrButton.getX() - x;
        }
        int y = insets.top;
        int h = scrollbar.getHeight() - (insets.top + insets.bottom);
        g.fillRect(x, y, w, h);
    }
    }

    @Override
    protected void paintIncreaseHighlight(Graphics g) {
            Insets insets = scrollbar.getInsets();
            Rectangle thumbR = getThumbBounds();
            g.setColor(new Color(202,207,203));

            if (scrollbar.getOrientation() == JScrollBar.VERTICAL) {
                int x = insets.left+decrButton.getWidth()/2-2;
                int y = thumbR.y;
                int w = 4;
                int h = incrButton.getY() - y;
                g.fillRect(x, y, w, h);
            }
        }


    @Override
    protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds)  
    {
        g.setColor(Color.WHITE);
        g.fillRect(trackBounds.x, trackBounds.y, trackBounds.width, trackBounds.height);
        paintDecreaseHighlight(g);
        paintIncreaseHighlight(g);

    }

  @Override
  protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds)
  {
      if(thumbBounds.isEmpty() || !scrollbar.isEnabled())     {
          return;
      }

      int w = 16;
      int h = 16;

      Graphics2D g2 = (Graphics2D) g;
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
          RenderingHints.VALUE_ANTIALIAS_ON);

      g.translate(thumbBounds.x, thumbBounds.y);

      GradientPaint gr = new GradientPaint(2, 0, new Color(158,161,162), 18, 16, new Color(96,99,98));
      g2.setPaint(gr);
      g2.fill(new Ellipse2D.Double(2, 0, w-1, h-1));

      g2.setPaint(new Color(203,207,203));
      g2.fill(new Ellipse2D.Double(6, 4, 7, 7));

      g.translate(-thumbBounds.x, -thumbBounds.y);
  }





} 

【问题讨论】:

  • 您应该发布SSCCE 以获得更快的帮助
  • 我尝试了您所描述的内容,并且没有问题,因此您的问题出在您未发布的代码中。顺便说一句,我不明白你为什么需要实现 UI。您可以更改 JScrollBar 的属性和行为,就像使用任何其他组件一样,无需实现 UI,只需调用您的自定义 UI 将调用的相同方法。
  • 我添加了 UI 的代码,因为有可能在那里找到问题。
  • 我自己制作了 ScrollbarUI 为什么?
  • 当心:don't use setXXSize, ever 另外,为每个实例设置一个 ui 非常脆弱(不会在任何 updateUI 中存活)

标签: java swing user-interface jscrollpane jscrollbar


【解决方案1】:

试试这个:

JScrollPane table = new JScrollPane(content){ @SuppressWarnings("static-access") @Override public JScrollBar createVerticalScrollBar() { return (new Scroler()).makeUI(); } };

为我工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    相关资源
    最近更新 更多